android - 读取/写入具有密码保护的 NFC 标签

标签 android security authentication nfc mifare

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

  • 第一次写我应该可以设置密码。
  • 下次当有人尝试读或写时,如果他有密码,那么他应该能够进行读/写。
  • 如果没有我在步骤 1 中设置的密码,任何其他应用程序都不能修改我的标签。

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

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

    最佳答案

    NFC 标签(或实际上是实现五个 NFC 论坛标签操作规范之一的 NFC 论坛标签)是一种简单的数据存储器,没有任何安全机制(除了将存储器锁定为只读)。这些标签旨在以 NDEF 格式存储可自由读取的数据。没有针对读取标签内容(或将标签内容复制到其他标签)的认证或保护机制进行标准化。
    然而,一些现有的标签产品实现了超出 NFC 论坛规定的附加安全功能。
    最简单的机制是一个简短的“密码”(通常是 32 位值)。对于身份验证,此密码以明文形式传输到标签,标签确认/拒绝身份验证。 (请注意,通过 NFC 以明文传输意味着任何嗅探通信的人都能够获取密码。)一些支持此类密码保护的标签可以使用身份验证在无访问、只读访问和只读访问之间切换定义的存储区域。读/写访问。

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

  • 一种更复杂的方法是使用共享 key 的相互质询-响应身份验证。与简单的明文密码相比,这意味着被动窃听者无法发现共享 key 。与密码一样,验证状态可用于在大多数现有标签产品的无访问、只读访问和读/写访问之间切换定义的存储区域。然而,并非所有这些都以密码方式将内存访问和身份验证过程绑定(bind)在一起。
  • 实现三通相互认证的产品有 NXP MIFARE Classic*、NXP MIFARE Ultralight C、NXP MIFARE DESFire (EV1)、Sony FeliCa 卡。
    *) 请注意,自 2008 年以来,已知 MIFARE Classic 的专有身份验证和加密协议(protocol)已被破坏。此外,MIFARE Classic 仅支持配备 NXP NFC 芯片组的 Android 设备。

  • 在 Android 上实现任何 from of 身份验证时,您应该注意以下几点:
  • 如果您仍然希望通过 NDEF 消息(您在 Intent 过滤器中声明的自定义记录或 Android 应用程序记录)自动启动您的应用程序,您需要拥有包含该 NDEF 消息的可自由读取的内存。由于密码保护/身份验证不是 NFC 论坛规范的一部分,因此 Android 本身无法对标签进行身份验证(无论如何,Android 都不会拥有正确的 key /密码)。因此,NDEF 内存区域(对于具有扁平线性可寻址内存的标签,这通常是标签内存的前 N ​​个块)必须无需身份验证即可读取。
  • 即使您不在应用程序 list 中使用 NFC Intent 过滤器而仅使用前台调度系统(或读取器模式 API),您可能仍希望使用 NDEF 来发现/过滤您的标签。
  • 您不能使用 NDEF 抽象层(即 Ndef/NdefFormatable 类)来访问 protected 内存区域。相反,您需要使用标记技术类之一 ( NfcA , ..., IsoDep ) 来交换特定于标记平台的低级命令。也不要尝试混合多个标签类(例如,使用 NfcA 发送身份验证命令,使用 Ndef 之后读取数据)。虽然这适用于某些设备,但它不适用于大多数设备,因为它们在这些通信对象之间切换时会重置与标签的通信。
  • 某些 Android 设备(主要在 Android 5 之前)上的标签存在检查机制存在已知问题,可能会干扰身份验证(即,存在检查可能会在身份验证命令之间发送命令,导致身份验证失败)。这个问题可以通过阅读器模式 API 来克服。
  • 最后,请注意,如果您将密码/身份验证 key 存储在应用程序中,攻击者可以轻松地对您的应用程序进行逆向工程以获取 key 。
  • 关于android - 读取/写入具有密码保护的 NFC 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36395457/

    相关文章:

    .net - 覆盖 ASP.NET MVC 中的授权属性

    linux - agetty.c 中的特殊字符

    java - 日期选择器对话框。设置无效日期时如何重新打开它

    android - 以编程方式创建主屏幕小部件 GUI

    android - 格式化@BindView代码

    php - 除了 SQL 注入(inject)之外,我还应该注意网站中的哪些其他安全漏洞?

    security - 如何正确编写Dockerfile,并在主机非root用户/uid下使用docker-compose(最佳实践)?

    android - 在 Android 的 TabHost 中隐藏一个选项卡

    security - 当老板让我在软件中默认密码与用户名相同时,我该怎么办?

    authentication - 如何离线使用LDAP凭证?