2013-11-04 80 views
9

Android 4.4引入基於主機的卡片仿真(HCE)。如您所知,所有NFC卡都帶有一個固定的卡號(NfcAdapter.EXTRA_ID)。基於主機的卡片仿真與固定卡片ID

我的辦公室門禁通常會檢測授權的NFC卡ID。將手機閃爍到KitKat後,我嘗試用接入閱讀器掃描手機。但是每當屏幕關閉並再次打開時,我就會得到不同的卡號。

我的確嘗試保持電話屏幕,並將模擬卡ID註冊到門禁系統。它設法授予訪問權限以打開大門。但是在屏幕關閉並再次打開後,這不起作用。

自從KitKat推出HCE模式後,我一直試圖用我的手機來模擬我的門禁卡。

任何關於使手機模擬卡ID固定的想法?

+1

您可以發佈您的代碼。我知道有一個新的參數4.4,requiresDeviceUnlock。你有沒有嘗試將其改爲false/true? – Pete

+0

沒有人會讓你仿效一張定製卡的UID,至少正式的說,它會打破大多數RFID,NFC門禁系統的安全性!!!但我非常確定,如果你降低水平,這很容易。 –

+0

我很積極地在google play store上看到一個完整的卡片模擬器(與卡片UID),並且我希望成爲它的開發者! –

回答

11

According to的負責HCE的谷歌開發者之一:

對不起,我知道很多人想這一點,但它不可能在正式版中。 (你當然可以用一些AOSP黑客來做)。原因是HCE是圍繞後臺操作設計的。如果我們允許應用程序設置UID,則每個應用程序都可能要設置自己的UID,並且無法解決衝突。我們希望通過HCE,NFC基礎設施將移動到更高層次的協議棧上進行身份驗證,而不是依賴於UID(無論如何都很容易克隆)。

7

至少Broadcom的NFC控制器(例如在Nexus 5中使用)支持設置防衝突標識符(UID),ATQA和SAK字節的任意值。但是,沒有API可以改變它們,所以唯一的方法就是修改libnfc-nci庫。

UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD); 
UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD); 
UINT8_TO_STREAM (p, 0x04); 
UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG); 
UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG); 
UINT8_TO_STREAM (p, platform); 
UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO); 
UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO); 
UINT8_TO_STREAM (p, sens_info); 

此代碼目前設置ATQA(值平臺的組合和0×04)和SAK字節(:

用於NFC-A相關的代碼是文件nfa_dm_discover.c中(行322開始) sens_info的值)。

爲了改變NFC-A防衝突期間使用的UID,您可以添加加入參數NFC_PMID_LA_NFCID1:

UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1); 
UINT8_TO_STREAM (p, 4); // length of NFCID1 in bytes 
UINT8_TO_STREAM (p, 0x12); 
UINT8_TO_STREAM (p, 0x34); 
UINT8_TO_STREAM (p, 0x56); 
UINT8_TO_STREAM (p, 0x78); 

你可以找到一個更加個性化的版本libnfc-NCI here(仍然工作在 - 雖然進展)。