如何使用Android手机作为NFC阅读器访问MIFARE DESFire卡?我打算在Android手机上开发一个Android应用程序(用于支付)。
我想使用Android手机执行的DESFire操作(身份验证,读写)需要SAM卡,我想我可以使用HCE模拟手机中的SAM卡。
答案 0 :(得分:5)
DESFire / DESFire EV1卡在ISO / IEC 14443-4数据交换协议(ISO-DEP)之上进行通信。因此,在Android设备上,可以通过IsoDep
类访问它们。因此,一旦获得标记句柄(Tag
对象),就可以使用以下方法实例化IsoDep
对象:
Tag tag = ... // (e.g. get from NFC discovery intent)
IsoDep isoDep = IsoDep.get(tag);
您可以连接到卡并使用IsoDep
对象的transceive()
方法向卡片发送命令(并从卡片接收回复):
isoDep.connect();
byte[] response = isoDep.transsceive(command);
您可以使用DESFire本机命令集,DESFire APDU包裹的本机命令集或ISO / IEC 7816-4命令集(有关详细信息,请参阅DESFire数据表)。由于某些设备上存在检测的已知问题(自动发送READ BINARY APDU以检测标签是否仍然可用),我强烈建议使用APDU包装的本机命令集或ISO / IEC 7816-4命令集(见this question)。
现在,有问题的部分是SAM。 SAM(安全访问模块)是一种安全的智能卡芯片,可以存储密钥并执行与DESFire卡通信的安全关键部分。您不能使用基于主机的卡仿真简单地“模拟”此类SAM。这没有多大意义,因为HCE的整个想法是从非接触式智能卡读卡器通过NFC接口到(不安全)应用处理器的路由通信。在应用处理器上实现SAM功能将破坏专用SAM芯片的整个目的(即高安全级别)。此外,为了模拟SAM功能,您不需要HCE,因为您可以直接存储用于访问应用程序中DESFire卡的凭据。
您可能拥有的一个选项是使用基于云的安全元素方法。因此,您可以在服务器/云中使用SAM功能,并通过您的应用程序将与DESFire卡的通信路由到该服务器。
byte[] command = receiveCommandFromBackend(); // receive command from server/cloud over the network
byte[] response = isoDep.transsceive(command);
sendResponseToBackend(response); // send response to server/cloud over the network
总结一下:你不需要HCE。根据您的安全要求,您可以存储用于访问应用程序中DESFire卡的凭据(请注意,攻击者可能能够提取该信息),或者您可以使用基于云的SE方法来转移安全关键部分到在线后端系统(但在与卡通信期间通常需要连续的网络访问)。
另一种方法当然是在您的设备中使用本地安全元素,但这需要您可以访问它,这通常不容易/不可能。
答案 1 :(得分:0)
Mifare DESFire不是支付标准,您应该依赖ISO14443-4(即ISO7816-4),至少是所有大牌所做的事情。这些也是HCE所依据的标准。拥有基于DESFire的支付系统可能是非常具体的。 DESFire的问题在于它是专有技术。使用HCE开发支付应用程序在安全性方面非常具有挑战性。