Эмуляция карты на основе хоста с фиксированным идентификатором карты
В Android 4.4 появилась эмуляция карт на основе хостов (HCE). Как вы знаете, все NFC-карты поставляются с фиксированным идентификатором карты (NfcAdapter.EXTRA_ID
).
Мой доступ к двери офиса обычно обнаруживает идентификатор карты NFC для авторизации. После мигания моего телефона в KitKat, я попытался сканировать мой телефон с помощью считывателя доступа. Но всякий раз, когда экран выключается и снова включается, я получаю другой идентификатор карты.
Я попытался сохранить экран телефона включенным и зарегистрировать эмулированный идентификатор карты в системе доступа к двери. Оно удалось предоставить доступ, чтобы открыть дверь. Но это не будет работать после того, как экран выключится и снова включится.
С тех пор, как KitKat ввел режим HCE, я пытаюсь эмулировать свою карту доступа к двери, используя свой телефон.
Есть идеи, как сделать телефон эмулируемым ID карты фиксированным?
3 ответа:
Это (по крайней мере, с официальным API) невозможно:
В первой части обмена устройство HCE представит свой UID; предполагается, что устройства HCE имеют случайный UID. Это означает, что на каждом касании UID, который будет представлен читателю, будет случайным образом сгенерированным UID. Из-за этого считыватели NFC не должны зависеть от UID устройств HCE в качестве формы аутентификации или идентификация.
(http://developer.android.com/guide/topics/connectivity/nfc/hce.html#ProtocolParams)
По словам одного из разработчиков Google, отвечающего за HCE:
Извините, я понимаю, что многие люди хотели этого, но это невозможно в официальной версии. (Вы, конечно, можете сделать это с помощью некоторого взлома AOSP). Причина в том, что HCE спроектирован вокруг фоновой работы. Если мы позволим приложениям устанавливать UID, то каждое приложение, возможно, захочет установить свой собственный UID, и нет никакого способа разрешить конфликт. Мы надеемся, что с HCE инфраструктура NFC перейдет на более высокий уровень из стека протоколов, чтобы сделать аутентификацию вместо того, чтобы полагаться на UID (который легко клонируется в любом случае).
По крайней мере, контроллер NFC Broadcom (используемый, например, в Nexus 5) поддерживает установку произвольных значений для идентификатора anticollision (UID), ATQA и байта SAK. Однако API для их изменения не существует,поэтому единственный способ-это изменить библиотеку libnfc-nci.
Соответствующий код для NFC-A находится в файле nfa_dm_discover.c (начиная с строки 322):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 (сочетание значения platform и 0x04) и Байт SAK (значение sens_info).
Чтобы изменить UID, используемый во время NFC-A anticollision, можно добавить параметр добавления 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 здесь (все еще работает).