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

pcj*_*pcj 10 security authentication android nfc mifare

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

  1. 第一次写我应该能够设置密码.
  2. 下次当有人试图读或写时,如果他有密码,那么他应该能够进行读/写操作.
  3. 没有我在步骤1设置的密码,任何其他应用程序都无法修改我的标签.

我还有另一种方法是将加密数据写入标签一次,写完就使标签只读.我能做到这一点.但现在我意识到使标签只读是不那么有效.

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

Mic*_*and 13

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

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

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

  • 实现此类密码验证的产品例如是Infineon SLE66R01P,NXP MIFARE Ultralight EV1和NXP NTAG21x.

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

  • 实现三次通过相互认证的产品是例如NXP MIFARE Classic*,NXP MIFARE Ultralight C,NXP MIFARE DESFire(EV1),Sony FeliCa卡.

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

在Android上实现任何身份验证时,您应该了解以下内容:

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

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

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

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

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