Read/write 到带密码保护的 NFC 标签

Read/write to NFC tag with password protection

我需要 write/read 文本数据到 NFC 标签。我期望 read/write 的工作方式如下:

  1. 第一次写应该可以设置密码
  2. 下次有人尝试读取或写入时,如果他有密码,那么他应该能够执行 read/write。
  3. 如果没有我在步骤 1 中设置的密码,其他应用程序应该无法修改我的标签。

我想到了另一种方法,将加密数据写入标签一次,写入完成后使标签只读。我能够做到这一点。但是现在我意识到将标签设为只读并不是那么有效。

我在网上搜索了很多,但还没有找到任何可靠的文章或指南。所以有谁做过NFC标签的密码保护请指导一下

某些标签(例如 MIFARE DESFire)本机支持您描述的密码/加密。在更常见的标签类型(Topaz/MIFARE Ultralight 等)上重新创建此功能本质上是不可能的,因为 NFC 标签没有内置的数据复制保护(设计)。您可以在编码之前加密数据,但这需要解码数据的工具对加密方法保密(可能是独立的应用程序,例如与 Android OS 分开) .正如您所说,更便宜的标签只能永久只读。

换句话说,大多数 NFC 标签将不支持您想要实现的目标,但存在支持大量数据和工具的标签(价格要贵得多)例如基于密码的加密。

由于 MIFARE DESFIRE 遵守 ISO 14443-4 并且假设您使用的是 Android,您可以使用 IsoDep 方法。有关如何 read/write 密码等的更多信息,请参阅这篇相关文章:How well does the Android NFC API support Mifare Desfire?

一个 NFC 标签(或者实际上是一个 NFC 论坛标签,它实现了五个 NFC 论坛标签操作规范之一)是一个简单的数据存储器,没有任何安全机制(除了将存储器锁定为只读)。这些标签旨在以 NDEF 格式存储可自由读取的数据。没有针对读取标签内容(或将标签内容复制到其他标签)的身份验证或保护机制标准化。

但是,一些现有的标签产品实现了超出 NFC 论坛规定的附加安全功能。

最简单的机制是一个简短的“密码”(通常是一个 32 位值)。为了进行身份验证,此密码以明文形式传输到标签,标签 acknowledges/rejects 进行身份验证。 (请注意,通过 NFC 以明文传输意味着任何嗅探通信的人都能够获得密码。)一些支持此类密码保护的标签可以使用身份验证在不可访问、只读访问和只读访问之间切换定义的存储区域read/write 访问。

  • 实施此类密码验证的产品有,例如,Infineon SLE66R01P、NXP MIFARE Ultralight EV1 和 NXP NTAG21x。

一种更复杂的方法是使用共享密钥的相互质询-响应身份验证。与简单的明文密码相比,这意味着被动窃听者无法发现共享密钥。与密码一样,身份验证状态可用于在不可访问、只读访问和大多数现有标签产品的 read/write 访问之间切换定义的存储区域。但是,并非所有这些都以密码方式将内存访问和身份验证阶段绑定在一起。

  • 实现三通相互认证的产品有NXP MIFARE Classic*、NXP MIFARE Ultralight C、NXP MIFARE DESFire (EV1)、Sony FeliCa卡等。

    *) 请注意,自 2008 年以来,MIFARE Classic 的专有身份验证和加密协议已被破解。此外,MIFARE Classic 仅在 Android 具有 NFC 芯片组的设备上受支持恩智浦

在 Android 上实施任何形式的身份验证时,您应该注意以下几点:

  1. 如果您仍然希望通过 NDEF 消息(您在 Intent 过滤器中声明的自定义记录或 Android 应用程序记录)自动启动您的应用程序,您需要有一个可自由读取的内存包含该 NDEF 消息。由于密码 protection/authentication 不是 NFC 论坛规范的一部分,因此 Android 本身无法对标签进行身份验证(无论如何,Android 都没有权限 key/password)。因此,NDEF 内存区域(对于具有平面线性可寻址内存的标签,这通常是标签内存的前 N ​​个块)必须是可读的,无需身份验证。

  2. 即使您不在应用程序清单中使用 NFC intent 过滤器并且仅使用前台调度系统(或 reader-模式 API),您可能仍然想为 你的 标签使用 discover/filter 的 NDEF。

  3. 您不能使用 NDEF 抽象层(即 Ndef/NdefFormatable 类)访问受保护的内存区域。相反,您需要使用一种标记技术 类 (NfcA, ..., IsoDep) 来交换特定于标记平台的低级命令。也不要尝试混合使用多个标签 类(例如,使用 NfcA 发送身份验证命令,然后使用 Ndef 读取数据)。虽然这适用于某些设备,但它不适用于大多数设备,因为它们在这些通信对象之间切换时会重置与标签的通信。

  4. 某些 Android 设备(主要是 Android 5 之前)的标签存在检查机制存在已知问题,可能会干扰身份验证(即存在检查可能在导致认证失败的认证命令之间发送命令)。这个问题可以通过 reader-模式 API.

    来解决
  5. 最后,请注意,如果您将 password/authentication 密钥存储在应用程序中,攻击者可以轻松地对您的应用程序进行逆向工程以获取密钥。

我目前正在从事基于NFC的预付费充值计量项目。我会直接回答您到目前为止提出的问题。 Mifare 经典系列、Ultralight 系列、NTag21x 系列等众多 NFC 标签都具有密码保护功能。

您问题的答案:

  1. 如何设置密码?
    参考各自数据sheet的数据sheet,然后研究内存组织。之后找到您要写入密码的页面或地址。假设对于 mifare 经典卡,扇区尾部块是密码密钥块。因此,只需将您的密码写入该块即可。保持正确的逻辑写入密码,否则卡可能会阻塞。
  2. 无论你写什么密码,都无法读取。所以知道那个密钥的人只被授权访问那个标签。
  3. 您可以使用 NFC 访问条件将整个标签内存配置为读写。

你只需要参考数据sheet。