使用Node.js nfc-pcsc模块写入后NFC标签扇区失效问题咨询
问题原因
核心问题是混淆了Mifare Classic卡的扇区号与块地址概念,误写入扇区尾块导致密钥被篡改:
- Mifare Classic 1K卡共包含16个扇区,每个扇区对应4个全局连续编号的块,其中每个扇区的第4个块为扇区尾块,固定存储
6字节密钥A + 4字节访问控制位 + 6字节密钥B,用户数据仅可写入扇区的前3个块。 nfc-pcsc库的authenticate、read、write方法的首个参数均为全局块地址,而非扇区号。你代码中直接对连续块地址执行写入操作,当循环变量i命中任意扇区的尾块时,写入的16字节内容会直接覆盖该扇区的原有密钥和访问控制规则,后续使用默认密钥ffffffffffff认证自然会失败。- 单块写入测试时选择的28号块对应扇区7的首个数据块(计算方式:28 = 7*4 + 0),不属于扇区尾块,写入不会修改密钥配置,因此运行正常。
- 空
catch语句吞掉了所有操作异常,导致你无法感知误写尾块的错误操作。
失效扇区恢复方法
- 若你写入尾块时使用的是代码中
fill(0)生成的缓冲区:尾块被写入的内容为[写入字符的ASCII码, 剩余15字节全0],可根据写入顺序推算该尾块对应的新密钥A(即写入内容的前6字节),使用新密钥完成认证后,将尾块重新写入默认配置FFFFFFFFFFFF FF078069 FFFFFFFFFFFF即可恢复扇区正常访问权限。 - 若写入操作已经将扇区访问控制位设置为禁止修改密钥的权限,则该扇区永久失效,无法恢复。
代码修复建议
写入数据前需将扇区号转换为对应的数据块地址,避开每个扇区的尾块:
// 扇区号转数据块地址,dataBlockIdx可取0、1、2,对应扇区内的三个可用数据块 const getDataBlockAddr = (sectorNum, dataBlockIdx) => { if(dataBlockIdx < 0 || dataBlockIdx > 2) throw new Error('invalid data block index') return sectorNum * 4 + dataBlockIdx }
循环写入时跳过每个扇区的第3个块(即块地址 % 4 === 3的块),即可避免误写尾块。
内容的提问来源于stack exchange,提问作者Vincenzo Longobardi
相关产品推荐
相关产品推荐

