You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:24:03