Эмуляция карты на основе хоста с фиксированным идентификатором карты


В Android 4.4 появилась эмуляция карт на основе хостов (HCE). Как вы знаете, все NFC-карты поставляются с фиксированным идентификатором карты (NfcAdapter.EXTRA_ID).

Мой доступ к двери офиса обычно обнаруживает идентификатор карты NFC для авторизации. После мигания моего телефона в KitKat, я попытался сканировать мой телефон с помощью считывателя доступа. Но всякий раз, когда экран выключается и снова включается, я получаю другой идентификатор карты.

Я попытался сохранить экран телефона включенным и зарегистрировать эмулированный идентификатор карты в системе доступа к двери. Оно удалось предоставить доступ, чтобы открыть дверь. Но это не будет работать после того, как экран выключится и снова включится.

С тех пор, как KitKat ввел режим HCE, я пытаюсь эмулировать свою карту доступа к двери, используя свой телефон.

Есть идеи, как сделать телефон эмулируемым ID карты фиксированным?

3 10

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 здесь (все еще работает).