如何使用 NFC Core 密码保护写入 iOS 13 上的 NFC NTAG216 标签

How to password protect writing to NFC NTAG216 tag on iOS 13 using NFC Core

我正在尝试使用 iOS 13 密码保护 NFC NTAG216 标签。我需要任何人都可以读取 NFC 标签,但我想限制对 NFC 标签的写入,除非您有预设密码。根据标签的规范,这应该是可能的,但用于编写 NDEF 标签的 API 似乎非常有限。我发现 NDEF 标签的 API 主要限于编写完整的消息有效负载。我还发现 NFCISO15693Tag API 根据 Apple 文档 https://developer.apple.com/documentation/corenfc/nfciso15693tag/3043817-writesingleblock

确实允许一些低级操作

谁能告诉我如何在 iOS13 中使用 NFC Core 密码保护 NDEF216 标签? 看到 NTAG216 规范 sheet 我们应该使用 PWD 和 PACK 参数,但我不知道如何将这些写到贴纸上,只有写入完整消息有效负载的选项?

我正在寻找的行为:

  1. 用户收到一个空的 NFC 标签
  2. 用户使用ios应用向NFC标签写入数据
  3. 用户可以选择一个密码来保护标签不被覆盖

然后过一段时间,用户需要自己更新标签,所以我想要这个行为

  1. 用户输入解锁 NFC 标签的密码
  2. 用户通过点击芯片上的 phone 解锁芯片
  3. 用户现在向芯片写入新数据
  4. 用户现在可以使用相同或新的密码再次锁定芯片,无需选择

非常感谢任何朝着正确方向提供的帮助

NTAG 216 是 Mifare Ultralight 标签

使用https://developer.apple.com/documentation/corenfc/nfcmifaretag/3043838-sendmifarecommand

如果您查看数据表 https://www.nxp.com/docs/en/data-sheet/NTAG213_215_216.pdf

第 8.8.1 节

The 32-bit PWD and the 16-bit PACK need to be programmed into the configuration pages, see Section 8.5.7

详细介绍了同类型标签的密码设置和使用,而这对于Android是相同的概念。

使用普通的超轻写入命令A2h将PWD写入E5h页(页地址用于NTAG 216)并将PACK写入[=12=的字节0和1 ]

再次使用正常的 ultralight 写入命令到页面 E3h 的字节 3 以配置受密码保护的第一页(可能您希望 4h 作为第一页)

再次使用正常的 ultralight 写入命令在页面 E4h 中写入正确的位以启用正确的保护级别和其他参数(您可能想先阅读此页面以获取当前值)

Apple 网站上的文档关于 CRC 的内容似乎有误,请参阅 以获取发送至 iOS 上的 Mifare Ultralight 标签的示例。

请注意,我实际上并没有尝试使用 iOS 设置密码。

您可以在 iOS 中使用以下方法向 NTAG 发送任何命令:

func sendCommand(data: CmdData, completionHandler: @escaping(Data?, Error?) -> Void) {
    tag?.sendMiFareCommand(commandPacket: data, completionHandler: { (data, error) in
        completionHandler(data, error)
    })
}

其中,参数数据是命令 APDU,标签对象是 NFCMiFareTag 类型。

命令 APDU 将密码和 PACK 写入 NFC 标签:

  1. 密码(FF FF FF FF):[写命令:CMD |地址 |数据] -> A2 E5 FF FF FF FF
  2. PACK(01 02):[写入命令:CMD |地址 |数据] -> A2 E6 01 02 RFU RFU

注意:您可以简单地写入 00h 来代替 RFU,或者您可以通过以下步骤保留这些值:

  • 阅读E6h页---->您将收到16字节(4页)的数据----> 取出前4个字节,就是E6页的数据----> 将第 0 个和第 1 个字节替换为要写入的 PACK 值 ----> 写入 如前所述,使用写命令更新 4 字节数据到 E6h 以上。

激活保护

一旦将密码和 PACK 值配置到 NFC 标签上,下一步就是通过定义 read/write 访问必须需要身份验证的页面来激活保护。为此:

  • 读取E3h页--->将前4个字节复制到data[]
  • Over-write 索引 3 处的 AUTH0 值,第一个用户页面编号为 04h,这意味着从 04h 开始的任何页面都需要身份验证才能读取(默认)访问

访问读取受保护的页面

  1. 用户输入 PWD 和 PACK 以解锁标签
  2. 使用输入的数据验证标签,使用以下命令:
    • 验证:[命令(1Bh) |密码] --> 1B FF FF FF FF
    • 标签将使用 PACK 值进行响应,可以通过将其与您拥有的 PACK 值进行匹配来验证该值以获得额外的安全性
  3. 现在标签处于认证状态,可以向标签写入数据。 **注意:一旦标签离开现场,身份验证状态就会重置。因此,您必须在同一会话中进行身份验证和写入数据。
  4. 除非需要更改 PWD/PACK,否则不需要进一步操作,因为每次会话完成时标签都会返回受保护状态,即离开现场。

可以参考NTAG 213/215/216 Data sheet