在Android中,当读取MIFARE Classic卡时,使用MifareClassic.authenticateSectorWithKeyA
(或authenticateSectorWithKeyB
)方法执行身份验证,但是这些方法的参数keyA
/ keyB
是简单的文本。因此,黑客很容易获得密钥。
在进行身份验证时,有没有办法不直接使用纯文本密钥而是将密钥存储在服务器中?然后,每次执行身份验证时,MIFARE Classic卡都会生成一个随机密钥,该随机密钥会传输到服务器,服务器会使用随机密钥和存储的身份验证密钥来计算令牌,然后将令牌传输到MIFARE Classic卡,验证令牌的位置,如果正确,则身份验证成功。
答案 0 :(得分:1)
否,在NXP的NFC控制器中实施MIFARE Classic身份验证的方式是NFC控制器本身需要知道密钥才能计算身份验证挑战和响应。其原因是NFC控制器执行手动认证和加密,并通过纯文本命令模拟对标签存储器的访问。由于Android设备中使用的NFC控制器似乎不支持任何形式的传输密钥加密,因此Android需要将纯文本密钥本身发送给NFC控制器。因此,用于MIFARE Classic的Android API需要纯文本密钥。当前无法解决此问题。
但是,还有其他标签技术(例如MIFARE DESFire)可通过您的应用程序直接处理身份验证和加密(NFC控制器透明地转发所有通信)。在这种情况下,您可以将该通信传递给某个后端服务器,以避免在应用程序内部存储纯文本密钥。