Android读取MIFARE Classic卡时如何防止密钥泄露?

How to prevent keys being leaked when reading MIFARE Classic cards on Android?

在Android中,读取MIFARE Classic卡时,使用MifareClassic.authenticateSectorWithKeyA(或authenticateSectorWithKeyB)方法进行认证,但参数keyA/keyB 这些方法是纯文本。因此,黑客很容易得到密钥。

有没有办法在认证时不直接使用明文密钥,而是将密钥存储在服务器中?然后,每次进行认证时,MIFARE Classic卡生成一个随机密钥,随机密钥被传送到服务器,服务器使用随机密钥和存储的认证密钥计算令牌,然后将令牌传送到MIFARE Classic卡,其中验证token,如果正确则验证成功。

不,MIFARE Classic 身份验证是在 NXP 的 NFC 控制器中实现的,NFC 控制器本身需要知道密钥才能计算身份验证质询和响应。这样做的原因是 NFC 控制器执行实际的身份验证和加密,并通过纯文本命令模拟对标签内存的访问。由于 Android 设备中使用的 NFC 控制器似乎不支持任何形式的传输密钥加密,因此 Android 需要将纯文本密钥本身发送到 NFC 控制器。因此,MIFARE Classic 的 Android API 需要纯文本密钥。目前没有办法解决这个问题。

但是,还有其他标签技术(例如 MIFARE DESFire),其中身份验证和加密由您的应用程序直接处理(NFC 控制器透明地转发所有通信)。在这种情况下,您可以将该通信传递给某些后端服务器,以避免在您的应用程序中存储纯文本密钥。