NFC Utils 指南
NTAG 424 DNA
在 NTAG 424 DNA 上配置密钥、安全动态消息和文件访问。TagTamper 变体增加自己的「检查」和「启用」控件。解码 SDM URL 也可离线使用。
概览
NTAG 424 DNA 是一个由五个密钥守护的小型文件系统。NDEF 消息位于文件 02。本页上的每个设置都是该文件或密钥的属性,每次更改都在应用用其中一个密钥打开的 EV2 安全消息会话中完成。
选择 NTAG 424 DNA 或 NTAG 424 DNA TagTamper。两者都有信息查看、NDEF、密钥、SDM 和访问工具。TagTamper 工具项只出现在对应的变体上。其他 DESFire 和 Plus 卡使用各自的信息查看工具页。
密钥
- 它是什么
- 五个槽位,密钥 0 到密钥 4,每个 32 位十六进制数。密钥 0 是主密钥。其余四个由指向它们的权限和功能使用。
- 更改它会发生什么
- 手机上看不到任何变化。它改变的是谁能打开使用该槽位的会话。
- 它需要什么
- 始终需要密钥 0。更改密钥 1 到 4 还需要在字段中填入它们的当前值,因为芯片接收的是用旧密钥掩码后的新密钥。
- 撤销
- 改回去,或者恢复出厂设置,两者都需要密钥 0。密钥 0 丢失后,卡片将永远保持原样,本应用中没有任何功能能将其恢复。
当前密钥
密钥页面保存密钥 0 到密钥 4,初始为出厂的全零,「出厂密钥」操作可将其恢复。每个任务都严格使用这些字段中的值,没有任何东西会覆盖它们。密钥库为它们供值,而不是替换它们。读取本应用保存了密钥的标签会填入字段,更改成功会更新它们,恢复出厂设置会将其清零。
检查
「检查」用每个当前密钥进行认证,逐个报告「已接受」或「已拒绝」,不做任何更改。标签过早拿开时,进行中的密钥显示「失败」,其余显示「未检查」。
更改
「更改」选择一个密钥编号并接收一个新的 32 位值,可手动输入或生成。先检查,再更改。若把密钥 0 改为一个随后丢失的值,标签将永远保持当前配置,应用无法将其恢复。
安全动态消息
开启安全动态消息后,芯片在每次读取时重写 URL 的部分内容。下面的字段决定重写哪些部分。
| 字段 | 含义 |
|---|---|
| 基础 URL | 标签打开的页面。应用按桌面编码器的布局把镜像字段作为查询参数追加。 |
| 加密 PICC 数据 | UID 和计数器用 PICC 数据密钥加密传输,而不是明文。开启后,它取代两个明文镜像。 |
| URL 中的 UID、URL 中的读取计数器 | UID 和读取计数器的明文镜像。 |
| CMAC | 用 CMAC 密钥为镜像字段签名,让服务器能拒绝复制品。 |
| URL 中的加密数据 | 一个 32 或 64 个字符的占位符 enc={enc},其前半部分在文件中保存至多 16 或 32 字节的明文。芯片在每次未认证的读取时把整个占位符替换为密文。需要开启 CMAC,并且 UID 和计数器都在 URL 中。下面的「加密数据」部分会详细说明。 |
| 读取计数上限 | 可选。计数器一旦达到该值,芯片就拒绝对该文件的所有未认证读取,手机将打不开任何内容,此时读取标签页会指明该上限。提高或移除上限可恢复读取,计数器不会重置。 |
| 自定义模板 | 可选。默认布局不适用时,填入带有 {uid}、{counter}、{cmac} 和 {picc} 占位符的完整 URL。{picc} 不能与 {uid} 或 {counter} 组合使用。 |
字段下方的等宽字体行用占位字母预览 URL。
- 它是什么
- 「URL 中的 UID」放入序列号,「URL 中的读取计数器」放入触碰次数,CMAC 添加一个用密钥计算的签名,让服务器能区分真实触碰和复制的链接。「加密 PICC 数据」把明文 UID 和计数器替换为一个只有密钥持有者才能解开的加密块。
- 更改它会发生什么
- 每次触碰都会打开不同的 URL。结果卡中的偏移量就是芯片在文件中写入实时值的位置。当计数器达到或超过读取计数上限时,芯片还会拒绝所有保留该上限的设置更改,包括访问权限,所以必须先在这里提高或移除上限。
- 它需要什么
- 「更改设置」密钥,并且你选择的 CMAC 或 PICC 密钥必须存在于卡片上。「应用」还会把写入设为密钥 0。
- 撤销
- 「禁用」,它保留消息和权限不变。
应用与禁用
「应用 SDM」写入 NDEF 并设置文件设置。此后文件可自由读取,写入或更改需要密钥 0。「禁用」关闭镜像,并保留访问权限下设置的任何权限。
加密数据
「URL 中的加密数据」是 URL 中的一段,32 或 64 个字符,芯片在每次未认证的读取时对其加密。你输入的明文,至多 16 或 32 字节,位于文件中该段的前半部分。读卡器永远看不到它。它们看到的是密文,因为计数器参与加密,密文每次触碰都会变化。
使用哪个密钥
芯片由 CMAC 密钥连同 UID 和读取计数器派生加密密钥。它不是单独的选项,所以为 CMAC 签名的密钥同时也加密数据,该功能需要开启 CMAC,并且 UID 和计数器都在 URL 中。
更新它
明文是普通的文件数据,所以通过用写入权限写入文件中的那一段来更改,在这里设置过的卡片上就是密钥 0。
读取它
完整扫描显示密文,当密钥页面持有 CMAC 密钥时,还会在下方显示明文。
隐藏它
这段数据块无法从 URL 中省略,但可以伪装。在自定义模板中给参数起任意名字,把它放进路径段,或者在它旁边开启「加密 PICC 数据」,让 URL 携带两个看起来相似的十六进制块。把 {cmacStart} 放在它前面,CMAC 就会连密文一起签名。
它不是什么
它不是智能卡。安全元件卡运行自己的小程序,带有 PIN 和挑战应答。424 只是让随意的读取者看不到一小段静态载荷,仅此而已。
访问权限
NDEF 文件上的四个选择器,每个可设为自由(0xE)、密钥 0 到密钥 4,或从不(0xF)。「更改设置」设为「从不」会让文件设置成为永久。只要「更改设置」允许,其他权限仍可更改。
- 读取谁可以读取消息。「自由」是每部手机都需要的,这里设为密钥会让手机看不到消息。
- 写入谁可以覆写消息。新卡上为「自由」,「应用 SDM」会把它设为密钥 0,这样没人能破坏镜像。
- 读写同一文件上的第二个密钥。满足「读取」或「读写」时允许读取,满足「写入」或「读写」时允许写入。
- 更改设置谁可以更改这四项权限和 SDM 布局。新卡上为密钥 0,也是锁定时真正起作用的一项。
- 它是什么
- NDEF 文件上的四项权限,每项为自由、某个密钥,或从不。
- 更改它会发生什么
- 「应用访问权限」重写文件设置,保持当前的 SDM 状态不变。你打开或关闭的每个槽位都会改变此后谁能读取、写入或重新配置该文件。
- 它需要什么
- 「更改设置」当前指定的密钥。页面顶部会显示该密钥,让将要使用的值一目了然。
- 撤销
- 应用新的权限,只要「更改设置」不是「从不」。
写入与读写的区别
「写入」和「读写」是两个独立的槽位,都涵盖写入,芯片按「或」的关系检查它们。任一槽位满足,写入即可通过。「读取」和「读写」对读取同理。「读写」是给完全拥有该文件的单个密钥的槽位,而「读取」为手机保持「自由」,「写入」保持关闭。要关闭写入,需要关闭两个槽位。
| 写入 | 读写 | 谁能写入 |
|---|---|---|
| 自由(0xE) | 任意 | 任何人。 |
| 密钥 0 | 自由(0xE) | 任何人,因为第二个槽位是开放的。 |
| 密钥 0 | 密钥 0 | 仅密钥 0。 |
| 密钥 0 | 密钥 1 | 密钥 0 或密钥 1。 |
| 从不(0xF) | 密钥 0 | 仅密钥 0,通过第二个槽位。 |
| 从不(0xF) | 从不(0xF) | 永远没有人。 |
在 424 上,信息卡把四项权限显示在一行中。刚「应用 SDM」之后,它显示为 Read E · Write 0 · RW 0 · Change 0。
锁定 424
424 上没有锁定命令。某项权限设为「从不」时卡片就成为永久状态,你选择哪项权限决定冻结什么。请只在你打算保持原样的卡片上这样做。
| 你想要 | 设置 | 之后 |
|---|---|---|
| SDM 布局和权限固定,消息仍然动态 | 「更改设置」设为从不(0xF) | 读取和 SDM 继续工作。写入遵循当前的写入权限。密钥仍可用密钥 0 更改。访问权限、禁用 SDM 和恢复出厂设置都会被拒绝。这是 SDM 标签的生产锁定状态。 |
| 消息也固定 | 「写入」设为从不(0xF),「读写」设为从不(0xF),「更改设置」设为从不(0xF),一次应用完成 | 文件永久只读。密钥仍可更改。 |
| 消息对手机永久隐藏 | 「读取」设为从不(0xF),并把「更改设置」设为从不(0xF) | 手机打不开任何内容。只有持有文件读取密钥的读卡器能看到数据。很少有人需要这种状态。 |
| 尚无永久更改 | 「写入」设为密钥 0,「更改设置」设为密钥 0 | 在手机看来像已锁定,而你仍可用密钥 0 更改一切。「应用 SDM」之后卡片已经处于这种状态。 |
「更改设置」仍开放时,把某项权限设为「从不」并不是锁定。「更改设置」是那把锁,其余三项是它锁住的东西。
The NFC Mint 锁定卡片的方式
The NFC Mint 的编码器为每张铸造完成的卡片设置读取自由、写入从不、读写从不、更改设置从不、CMAC 使用密钥 1、计数器检索为从不。此后读取和安全动态消息永久有效,没人能写入文件,没人能更改布局,密钥仍可通过密钥 0 更改,这是我们唯一保留给自己的东西。在应用中达到同样的状态需要两步。
- 第一步:安全动态消息用你想要的 CMAC 密钥配置,上限字段留空,然后应用。这也会把写入和读写设为密钥 0。
- 第二步:访问权限读取自由(0xE)、写入从不(0xF)、读写从不(0xF)、更改设置从不(0xF)。应用,然后在提示无法撤销的弹窗中继续。
信息卡随后显示为 Read E · Write F · RW F · Change F。从此应用访问权限、禁用 SDM 和恢复出厂设置都会被拒绝,卡片仍可读取,其 URL 仍在每次触碰时变化。
解码 SDM URL
- 它是什么
- 在手机上完成 SDM 链接的服务器端工作。取一个 URL,找出芯片填入的字段,解密已加密的内容,并检查签名。它不需要射频场中有标签。粘贴任意 URL,或按「使用上次读取」取用上次 424 读取得到的 URL。
- 更改它会发生什么
- 解码报告 UID 和计数器(明文或从 PICC 数据中恢复)、解密后的文本、防拆封条状态,以及 CMAC 有效或无效,无效时附带期望值。CMAC 不匹配意味着链接被篡改、从另一枚标签复制而来,或用不同的密钥签名。
- 它需要什么
- CMAC 密钥(它同时解密加密数据),以及当 URL 携带加密 PICC 数据时的 PICC 数据密钥。两者位于字段下方,其值内联显示在共用的密钥槽位中,读取一枚开启了 SDM 的标签后,它们默认为该标签设置所指定的槽位。
- 撤销
- 这不是更改。
如何推测各值的角色
应用把 URL 拆分为各个值,查询参数和形似十六进制的路径段一视同仁,然后先按名称、再按长度推测每个值的角色。14 个十六进制字符视为 UID,6 个视为计数器,16 个视为 CMAC,32 个视为 PICC 数据或加密数据,64 个视为加密数据,两个字母视为防拆状态。每个推测都显示在选择器中,所以来自其他编码器、使用自己参数名的 URL 可以手动纠正。反正芯片从不看到这些名称,所以一旦选择器指明了哪个值是什么,任何编码器生成的 URL 都以同样的方式解码。
「CMAC 输入起点」选择 MAC 输入从哪里开始,有加密数据时从加密数据开始,否则从 CMAC 本身开始,其他布局则从 URL 开头开始。
TagTamper
- 它是什么
- 在 NTAG 424 DNA TagTamper 上,一根横跨封条的导线回路,芯片每次上电时都会测量它。GetTTStatus 返回两个值。「当前」是导线此刻的读数。「永久」是自回路启用以来导线是否曾读到断开,它只会单向变化。
- 更改它会发生什么
- 启用时用 SetConfiguration 选项 07 打开回路,并选定此后 GetTTStatus 需要的状态密钥,The NFC Mint 出货时设为无需认证(Free)。NFC Utils 在 TagTamper 工具页中提供「检查」和「启用」。「检查」查询当前状态和永久状态。「启用」需要密钥 0,并选择状态访问密钥。TamperKit 提供独立的激活记录和长期检查。
- 它需要什么
- 启用需要密钥 0。状态访问设为「自由」时任何读卡器都可以查询,设为某个密钥时需要认证,设为「无访问」时状态只能通过已配置的 SDM 获取。
- 撤销
- 无。回路无法再次关闭。
未激活、完好、已断裂
NFC Utils、NFC Proof 和 TamperKit 中的封条判定是一致的。只有两个值都读为「闭合」时才是「完好」,任一值曾读为「断开」即为「已断裂」,回路从未启用则为「未激活」。剪断后重新接上的导线读为「已断裂」,因为芯片已永久记录了第一次断开。
激活前被剪断的回路
启用之前芯片不做任何测量,所以激活前被剪断的回路看不出来,启用也不会因此失败。第一次测量随启用本身进行,已剪断的回路当场就读为「已断裂」。从那时起,芯片无法区分激活前剪断和激活后剪断的回路,这就是 TamperKit 在激活时记录状态的原因。
擦除与重置
在 NTAG 424 下,该行是「擦除与重置」,不出现「格式化」,因为 424 的能力容器是内置于芯片的固定文件,没有什么可写的。
擦除标签
清空消息。密钥和权限保留。需要「写入」为「自由」,或其指定的密钥。
恢复出厂设置
清零消息,恢复文件的出厂权限并关闭 SDM,然后把每个密钥设回全零。需要「密钥」下的密钥 0,以及任何非零密钥的当前值。它会清除该标签的密钥库条目和「当前密钥」字段,因为密钥已恢复出厂。对于「更改设置」为「从不」的卡片,它无法恢复权限。
哪些操作无法撤销
| 操作 | 冻结的内容 |
|---|---|
| 「更改设置」为从不(0xF)时任何设为从不(0xF)的权限 | 该项权限,连同「更改设置」一起,即整个布局。 |
| 丢失密钥 0 | 一切。没有它,芯片上没有任何命令能更改密钥。 |