Карты DESFire/DESFire EV1 взаимодействуют поверх протокола обмена данными ISO/IEC 14443-4 (ISO-DEP). Поэтому на устройствах Android к ним можно получить доступ через класс IsoDep
. Итак, как только вы получите дескриптор тега (объект Tag
), вы можете создать экземпляр объекта IsoDep
, используя:
Tag tag = ... // (e.g. get from NFC discovery intent)
IsoDep isoDep = IsoDep.get(tag);
Вы можете подключиться к карте и использовать метод transceive()
объекта IsoDep
для отправки команд на карту (и получения ответов от нее):
isoDep.connect();
byte[] response = isoDep.transsceive(command);
Вы можете использовать собственный набор команд DESFire, встроенный собственный набор команд DESFire APDU или набор команд ISO/IEC 7816-4 (дополнительную информацию см. в техническом описании DESFire). Из-за известных проблем с обнаружением присутствия на некоторых устройствах (которые автоматически отправляют READ BINARY APDU, чтобы определить, доступен ли тег), я настоятельно рекомендую использовать либо встроенный собственный набор команд APDU, либо набор команд ISO/IEC 7816-4. (см. этот вопрос).
Теперь проблемной частью является SAM. SAM (модуль безопасного доступа) — это защищенный чип смарт-карты, который содержит ключи и выполняет важные для безопасности части связи с картой DESFire. Вы не можете просто «эмулировать» такой SAM, используя эмуляцию карты на основе хоста. В этом не было бы особого смысла, поскольку вся идея HCE заключается в маршрутизации связи от бесконтактных считывателей смарт-карт через интерфейс NFC к (незащищенному) процессору приложения. Реализация функциональности SAM на процессоре приложения разрушила бы всю цель (т. е. высокий уровень безопасности) выделенного чипа SAM. Кроме того, для эмуляции функциональности SAM вам не понадобится HCE, поскольку вы можете напрямую хранить учетные данные для доступа к карте DESFire в своем приложении.
Вариант, который у вас может быть, — использовать облачный безопасный элемент. Таким образом, вы можете иметь функциональность SAM на сервере/в облаке и направлять связь с вашей картой DESFire через ваше приложение на этот сервер.
byte[] command = receiveCommandFromBackend(); // receive command from server/cloud over the network
byte[] response = isoDep.transsceive(command);
sendResponseToBackend(response); // send response to server/cloud over the network
Подводя итог: вам не нужен HCE. В зависимости от ваших требований безопасности вы можете либо сохранить учетные данные для доступа к картам DESFire в своем приложении (обратите внимание, что злоумышленник может извлечь эту информацию), либо вы можете использовать облачный подход SE для переноса критических частей безопасности. к серверной онлайн-системе (но обычно для этого требуется постоянный доступ к сети во время связи с картой).
Еще один подход, конечно, заключается в использовании локального элемента безопасности на вашем устройстве, но для этого потребуется, чтобы у вас был доступ к нему, что обычно непросто/невозможно.
person
Michael Roland
schedule
08.10.2014