Чтение/запись в тег NFC с защитой паролем

Мне нужно написать/прочитать текстовые данные в тег NFC. Я должен ожидать, что чтение/запись будет работать следующим образом:

  • В первый раз я могу установить пароль.
  • В следующий раз, когда кто-либо попытается прочитать ИЛИ написать, если у него есть пароль, он должен иметь возможность читать/писать.
  • Ни одно другое приложение не сможет изменить мой тег без пароля, установленного на шаге 1.

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

Я много искал по интернету, но не нашел надежной статьи или руководства. Поэтому, если кто-то сделал защиту паролем тегов NFC, пожалуйста, помогите мне.

Ответ 1

Тег NFC (или фактически тег NFC Forum, который реализует одну из пяти спецификаций операций тегов NFC Forum) - это простая память данных без каких-либо механизмов безопасности (кроме блокировки памяти только для чтения). Эти теги предназначены для хранения свободно читаемых данных в формате NDEF. Стандартизированы механизмы аутентификации или защиты от чтения содержимого тега (или копирования содержимого тегов на другие теги).

Однако некоторые существующие продукты тегов реализуют дополнительные функции безопасности, которые выходят за рамки того, что указано в NFC Forum.

Самый простой механизм - это короткий "пароль" (обычно это 32-битное значение). Для аутентификации этот пароль передается тегу в открытом тексте, а тег подтверждает/отклоняет аутентификацию. (Обратите внимание, что передача в открытом тексте над NFC означает, что любой, кто нюхает сообщение, может получить пароль.) Некоторые теги, поддерживающие этот тип защиты паролем, могут использовать аутентификацию для переключения определенной области памяти между доступом, доступом только для чтения и доступ для чтения/записи.

  • Продукты, реализующие этот тип проверки пароля, включают, например, Infineon SLE66R01P, NXP MIFARE Ultralight EV1 и NXP NTAG21x.

Более сложным подходом является взаимная аутентификация с запросом и ответом с использованием общего ключа. По сравнению с простым паролем открытого текста это означает, что пассивный подслушиватель не может обнаружить общий ключ. Как и в случае с паролем, состояние аутентификации может использоваться для переключения определенной области памяти между доступом, доступом только для чтения и доступом для чтения/записи с большинством существующих продуктов тегов. Однако не все из них криптографически связывают доступ к памяти и аутентификацию pahse вместе.

  • Продукты, реализующие трехстороннюю взаимную аутентификацию, представляют собой, например, NXP MIFARE Classic *, NXP MIFARE Ultralight C, NXP MIFARE DESFire (EV1), карты Sony FeliCa.

    *) Обратите внимание, что проприетарный протокол аутентификации и шифрования MIFARE Classic, как известно, был поврежден с 2008 года. Более того, MIFARE Classic поддерживается только на устройствах Android с набором микросхем NFC от NXP.

Когда дело доходит до внедрения любой из аутентификации на Android, вы должны знать следующее:

  • Если вы все еще хотите воспользоваться автоматическим запуском своего приложения с помощью сообщения NDEF (либо пользовательской записи, которую вы объявляете в фильтре намерения, так и записи приложения Android), вам необходимо иметь свободно читаемую память содержащий сообщение NDEF. Поскольку защита паролем/аутентификация не является частью спецификаций Форума NFC, Android сам не может аутентифицироваться в теге (Android в любом случае не будет иметь правильного ключа/пароля). Следовательно, область памяти NDEF (для тегов с плоской линейно-адресной памятью, как правило, это первые N блоков памяти тегов) должна быть доступна для чтения без аутентификации.

  • Даже если вы не используете фильтры намерений NFC в манифесте приложения и используете только систему диспетчеризации переднего плана (или API-интерфейс режима чтения), вы все равно можете использовать NDEF для обнаружения/фильтрации ваших тегов.

  • Вы не можете использовать слой абстракции NDEF (то есть классы Ndef/NdefFormatable) для доступа к области защищенной памяти. Вместо этого вам необходимо обмениваться командами низкоуровневого типа, использующими тег, с использованием одного из классов технологий тегов (NfcA,..., IsoDep). Также не пытайтесь смешивать между классами тегов mutliple (например, используя NfcA для отправки команды проверки подлинности и Ndef для чтения данных впоследствии). Хотя это работает на некоторых устройствах, оно не будет работать на большинстве устройств, поскольку они reset связывают с тегом при перемещении между этими объектами связи.

  • Известны проблемы с механизмом проверки присутствия тегов на некоторых устройствах Android (в основном до Android 5), которые могут помешать аутентификации (т.е. проверка наличия может отправлять команды между командами аутентификации, приводящими к сбоям аутентификации). Эта проблема может быть решена с помощью API-интерфейса режима чтения.

  • Наконец, имейте в виду, что если вы храните ключ пароля/аутентификации в приложении, злоумышленник может легко перепроектировать ваше приложение, чтобы получить ключ.

Ответ 2

Некоторые теги, такие как MIFARE DESFire изначально поддерживают пароли/шифрование, как вы описали. Повторное использование этой функции для более распространенных типов тегов (Topaz/MIFARE Ultralight и т.д.) По своей сути невозможно, поскольку теги NFC не имеют встроенных защит для копирования своих данных (по дизайну). Вы можете потенциально зашифровать свои данные до того, как они будут закодированы, но это потребует, чтобы инструмент декодировал данные, которые были бы секретными для метода шифрования (например, автономное приложение, отдельно от ОС Android). Более дешевые теги, как вы говорите, могут быть сделаны только на постоянной основе.

Другими словами, большинство тегов NFC не будут поддерживать то, что вы пытаетесь достичь, но существуют теги (которые значительно дороже), которые поддерживают большие объемы данных и инструменты, такие как шифрование на основе пароля.

Поскольку MIFARE DESFIRE придерживается стандарта ISO 14443-4 и предполагается, что вы используете Android, вы можете использовать методы IsoDep. Для получения дополнительной информации о том, как читать/писать пароли и т.д. См. Эту статью: Насколько хорошо поддерживает NFC API для Android Mifare Desfire?

Ответ 3

В настоящее время я работаю над проектом по предоплате счетчиков на основе NFC. Я бы сразу пришел к вопросу о том, что вы уже задали. Функция защиты паролем предоставляется для многих тегов NFC, таких как классическое семейство Mifare, семейство Ultralight, семейство NTag21x.

Ответы на ваши вопросы:

  1. Как установить пароль?
    Обратитесь к листу данных соответствующего листа, затем изучите организацию памяти. После этого найдите страницу или адрес, где вы хотите написать пароль. Предположим, что для классических карт mifare блок секторного трейлера является блоком пароля. Так что просто напишите свой пароль к этому блоку. Сохраняйте правильную логику, чтобы написать пароль, иначе карта может заблокироваться.
  2. Какой бы пароль вы ни написали, он не может быть прочитан. Таким образом, человек, который знает этот ключ, имеет право только на доступ к этому тегу.
  3. Вы можете настроить всю память тегов как чтение и запись, используя условия доступа NFC.

Все, что вам нужно сделать, это обратиться к спецификации.