使用密码保护读取/写入NFC标签

时间:2016-04-04 05:59:17

标签: android security authentication nfc mifare

我需要将文本数据写入/读取到NFC标签。我希望读/写的方式应该如下:

  1. 第一次写我应该可以设置密码。
  2. 下次当有人试图读或写时,如果他有密码,那么他应该可以进行读/写。
  3. 没有我在步骤1设置的密码,其他任何应用程序都无法修改我的标签。
  4. 我还有另一种方法是将加密数据写入标签一次,写完就使标签只读。我能做到这一点。但现在我意识到使标签只读是不那么有效。

    我在网上搜索了很多,但还没找到任何可靠的文章或指南。因此,如果有人对NFC标签进行了密码保护,请指导我。

3 个答案:

答案 0 :(得分:10)

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

但是,某些现有标签产品实现了超出NFC论坛指定范围的其他安全功能。

最简单的机制是短“密码”(通常是32位值)。对于身份验证,此密码以明文形式传输到标记,标记会确认/拒绝身份验证。 (请注意,通过NFC以明文形式传输意味着任何嗅探通信的人都能够获取密码。)支持此类密码保护的某些标签可以使用身份验证在无访问权限,只读访问权限和非访问权限之间切换已定义的内存区域。读/写访问。

  • 实施此类密码验证的产品包括英飞凌SLE66R01P,恩智浦MIFARE Ultralight EV1和恩智浦NTAG21x。

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

  • 实施三通相互认证的产品包括恩智浦MIFARE Classic *,恩智浦MIFARE Ultralight C,恩智浦MIFARE DESFire(EV1),索尼FeliCa卡。

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

在Android上实现任何身份验证时,您应该注意以下事项:

  1. 如果您仍希望通过NDEF消息(您在意图过滤器或Android应用程序记录中声明的自定义记录)自动启动应用程序,您需要拥有可自由读取的内存包含该NDEF消息。由于密码保护/身份验证不是NFC论坛规范的一部分,因此Android本身无法对代码进行身份验证(Android无论如何都没有正确的密钥/密码)。因此,NDEF存储区(对于具有扁平线性可寻址存储器的标签,这通常是标签存储器的前N个块)必须在没有认证的情况下可读。

  2. 即使您没有在应用程序清单中使用NFC意图过滤器并且仅使用前台调度系统(或读取器模式API),您仍可能希望使用NDEF来发现/过滤你的标签。

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

  4. 在一些可能干扰认证的Android设备(主要在Android 5之前)上存在标签存在检查机制的已知问题(即,存在检查可以在认证命令之间发送导致认证失败的命令)。使用reader-mode API可以克服这个问题。

  5. 最后,请注意,如果您在应用中存储密码/身份验证密钥,攻击者可以轻松地对您的应用进行逆向工程以获取密钥。

答案 1 :(得分:3)

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

换句话说,大多数 NFC标签不支持您要实现的功能,但存在支持大量数据和工具(如基于密码的加密)的标签(价格相当昂贵) 。

由于MIFARE DESFIRE遵守ISO 14443-4并假设您使用Android,因此您可以使用IsoDep方法。有关如何读/写密码等的详细信息,请参阅此相关文章:How well does the Android NFC API support Mifare Desfire?

答案 2 :(得分:1)

我目前正在从事基于NFC的预付费充值计量项目。我会直接问你到目前为止所问的问题。 Mifare classic系列,Ultralight系列,NTag21x系列等许多NFC标签都具有密码保护功能。

回答您的问题:

  1. 如何设置密码?
    请参阅相应数据表的数据表,然后研究存储器的组织。之后,找到您要写入密码的页面或地址。假设对于mifare经典卡,扇区尾部块是密码密钥块。因此,只需将密码写入该块。保持适当的逻辑以编写密码,否则卡可能会阻塞。
  2. 无论您输入了什么密码,都无法读取。因此,知道该密钥的人仅被授权访问该标签。
  3. 您可以使用NFC访问条件将整个标签存储器配置为可读写。

您需要做的只是参考数据表。