Mifare卡安全

Posted

技术标签:

【中文标题】Mifare卡安全【英文标题】:Mifare card security 【发布时间】:2014-08-16 12:35:11 【问题描述】:

几天前,我连接了一个 USB 非接触式智能卡读卡器,并通过 USB Sniffer 工具嗅探了该 USB 端口。之后,我在读卡器上放了一张 1k Mifare 卡,读取了 1 个字节。

我查看了嗅探器工具的输出,了解到密钥(读取密钥和写入密钥)在没有任何加密的情况下传输到卡!

现在我想知道这种机制真的安全吗??!如果我更改读卡器的 API 使其表现得像 Mifare 卡并将其移近原始读卡器并通过我的计算机嗅探两个读卡器之间的通信,我不能获得密钥吗?!

这是否可以让一个阅读器在另一个非接触式阅读器的领域中表现得像一张 mifare 卡?


更新: 据我所知,在发送验证命令之前,必须在 mifare 卡上加载密钥! 如下所示,我将密钥加载到卡上! [默认为FF FF FF FF FF FF]。

同时,我嗅到了我的 ACRA122U 连接的 USB 端口! 如下所示,密钥是明文发送的!

我做错了什么?!

注:Hedayat小姐(我的同事),也证实了! :))

【问题讨论】:

【参考方案1】:

您不是在嗅探读卡器和 MIFARE Classic 卡之间的通信,而是在 PC 和读卡器 (USB CCID) 之间的通信

为了与 MIFARE Classic 卡进行通信,您必须将访问密钥加载到读卡器上。这就是“加载身份验证密钥”命令(在您的屏幕截图中)所做的。对于 ACR122U,密钥存储在读卡器的易失性存储器中。其他读卡器也可能支持非易失性密钥插槽(请参阅读卡器文档和非接触式存储卡的 PC/SC 规范部分)。

稍后,当您发出认证命令时,阅读器将执行 MIFARE Classic 相互认证,这基本上是一个挑战响应认证和密钥协商协议。因此,读卡器不会将实际密钥发送到卡,而是从卡接收随机数,用密钥对随机数进行加密,并将加密后的随机数返回给卡。然后卡片将使用相同的密钥解密随机数,从而验证读卡器是否使用了正确的密钥。

【讨论】:

【参考方案2】:

不,密钥是不传输的,因为在读取一个字节的情况下不需要传输任何密钥,根据配置,它们可能需要应用。我不知道,你的嗅探器输出告诉你什么。

不,Mifare (Classic) 不安全,但这是一个在 SO 上得到充分回答的单独问题。总结:密钥太短,因此使用的加密算法太弱。

不,读卡器不能伪装成卡片;即使可以:您似乎认为,密钥是广播的,然后您可以简单地从空中抓取它们,这与标记相去甚远。

【讨论】:

请查看有问题的更新部分。 @TheGoodUser:密钥必须设置一次,然后才能使用给定的卡。既不需要也不建议在每个会话中设置它(也不使用默认值 FF FF ...),因此这应该在单独的程序中只运行一次,并且不会显示在您的嗅探器转储中。 打扰一下,亲爱的 Guidot,密钥是加载到读卡器中还是加载到卡中? @TheGoodUser:我怀疑,这可能是问题所在:要建立密钥必须将其存储在上,因此显然传输它在那里;这是偶尔进行的,甚至只进行一次。要访问受密钥保护的数据,您必须将其传输给阅读器;经常这样做,或者(如果不允许不受保护的访问)甚至总是这样做。 当我在读卡器或卡上加载密钥时(我不知道是哪一个),即使从读卡器中取出卡并再次将它放在读卡器上并获得一个,我也可以验证卡新的 ATR,甚至在关闭和打开 SDK 之后(无需再次加载密钥)!但是在断开阅读器并再次连接后,我必须再次加载密钥才能进行身份验证。这是否意味着当我加载密钥时,它们保存在阅读器的易失性缓冲区中?

以上是关于Mifare卡安全的主要内容,如果未能解决你的问题,请参考以下文章

mifare教程 用MifareClassic工具模拟加密门禁教程

获取 mifare 卡序列号不正确

NFC的mifare卡与ntag具体区别

使用 javax.smartcardio 读取 NFC Mifare Ultralight 卡

First Auth Mifare Plus 卡

使用 libnfc 格式化/读取/写入 NDEF Mifare 1K 卡