用ACR122U读写器破解一张食堂饭卡,我发现了M1卡存储余额的秘密
解密M1卡:从食堂饭卡破解看NFC安全机制
那天中午在食堂排队时,我突然意识到手中的饭卡可能隐藏着不为人知的秘密。这张看似普通的塑料卡片,每次"嘀"一声就能完成支付,背后究竟是如何存储和计算余额的?作为一名硬件爱好者,我决定用ACR122U读写器一探究竟。
1. 认识我们的研究对象:M1卡
M1卡的全称是NXP Mifare1系列智能卡,采用13.56MHz射频识别技术。你可能不知道的是,这种卡片已经广泛应用于:
- 校园一卡通系统
- 公共交通卡
- 门禁卡
- 会员储值卡
M1卡的核心特点:
- 1KB存储容量(部分型号可达4KB)
- 分为16个扇区,每个扇区4个块
- 每个扇区有独立的两组密码(Key A和Key B)
- 采用三重认证机制
注意:实际操作前请确认你拥有该卡的合法使用权,未经授权的卡片操作可能涉及法律风险
2. 工具准备与基础环境搭建
要分析M1卡,我们需要以下硬件和软件:
2.1 硬件配置
| 设备名称 | 型号 | 用途说明 |
|---|---|---|
| NFC读写器 | ACR122U | 卡片数据读取与写入 |
| 测试用M1卡 | 任意品牌 | 建议使用自己的可操作卡片 |
| 计算机 | 任意配置 | 运行分析软件 |
2.2 软件工具链
- 驱动软件:ACR122U官方驱动
- 分析工具:
- Mifare Classic Tool (MCT)
- HxD十六进制编辑器
- Python脚本(用于数据解析)
# 简单的十六进制转十进制工具 def hex_to_balance(hex_str): value = int(hex_str, 16) return value / 100.0 # 假设存储单位为分 print(hex_to_balance("7CC4")) # 输出:319.43. 卡片数据结构深度解析
通过ACR122U读取卡片后,我们得到了一个1KB的dump文件。用十六进制编辑器打开,发现数据主要分布在几个关键扇区。
3.1 扇区布局分析
典型的M1卡存储结构如下:
扇区0: [块0] UID和厂商信息 [块1] 用户数据 [块2] 用户数据 [块3] 密码A(6B) + 存取控制(4B) + 密码B(6B) 扇区1-15: 类似结构,每个扇区独立控制3.2 余额存储的奥秘
通过对比多次消费前后的数据变化,我们定位到余额存储在扇区11的块1中:
00 00 00 27 00 00 74 A4 FF FF 8B 5B 00 00 00 23其中关键数据段:
74 A4:当前余额(0x74A4 = 29860分 = 298.6元)8B 5B:校验值(0x74A4取反+1 = 0x8B5C,实际少1可能是特殊算法)27和23:交易计数器
提示:许多消费卡系统采用"分"作为基本单位存储金额,分析时需注意单位转换
4. 安全机制与防护建议
虽然我们成功解析了卡片数据结构,但这揭示了M1卡的一些安全隐患:
4.1 已知安全漏洞
弱加密问题:
- Crypto1算法已被破解
- 部分卡片使用默认密码(如FF FF FF FF FF FF)
数据校验不足:
- 部分系统仅依赖卡片存储数据
- 缺乏服务器端验证
物理安全缺陷:
- 卡片易被克隆
- UID可伪造(某些特殊卡)
4.2 防护措施建议
对于个人用户:
- 为卡片设置复杂密码(如果系统支持)
- 定期检查消费记录
- 避免将卡片长时间暴露在高磁场环境
对于系统设计者:
- 采用更安全的CPU卡替代M1卡
- 实现服务器端余额校验
- 使用动态加密算法
5. 进阶实验:数据修改与验证
在完全理解数据结构后,我们可以尝试修改余额数据。以下是关键步骤:
- 定位目标扇区:确认余额存储位置(本例为扇区11块1)
- 计算新值:
- 600元 = 60000分 = 0xEA60
- 校验值 = ~0xEA60 + 1 = 0x15A0
- 修改数据:
原数据:00 00 00 27 00 00 74 A4 FF FF 8B 5B 00 00 00 23 新数据:00 00 00 27 00 00 EA 60 FF FF 15 A0 00 00 00 23 - 写入验证:
- 使用Mifare Classic Tool写入修改后的块
- 在消费终端上测试新余额
# 使用nfc-mfclassic工具写入修改后的块 nfc-mfclassic w B a dump.mfd modified.mfd这个实验让我深刻理解了M1卡的工作原理,也意识到日常使用的各种智能卡其实都遵循着类似的存储逻辑。下次当你"嘀"一声刷卡时,或许会想起这背后复杂的十六进制舞蹈。
