0 android nfc mifare contactless-smartcard hce
如何使用Android手机作为NFC读取器访问MIFARE DESFire卡?我打算在Android手机上开发一个Android应用程序(用于付款)。
我想使用Android手机执行的DESFire操作(身份验证,读取和写入)需要SAM卡,我想我可以使用HCE在手机中模拟SAM卡。
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);
Run Code Online (Sandbox Code Playgroud)
您可以连接到卡,并使用IsoDep对象的transceive()方法向卡发送命令(并从卡接收响应):
isoDep.connect();
byte[] response = isoDep.transsceive(command);
Run Code Online (Sandbox Code Playgroud)
您可以使用DESFire本机命令集,DESFire APDU包装的本机命令集或ISO / IEC 7816-4命令集(有关更多详细信息,请参见DESFire数据表)。由于某些设备上的状态检测存在已知问题(它会自动发送READ BINARY APDU以检测标记是否仍然可用),因此我强烈建议使用APDU包装的本机命令集或ISO / IEC 7816-4命令集(请参阅此问题)。
现在,有问题的部分是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
Run Code Online (Sandbox Code Playgroud)
总结一下:您不需要HCE。根据您的安全要求,您可以在应用程序中存储用于访问DESFire卡的凭据(请注意,攻击者可能能够提取该信息),也可以使用基于云的SE方法来转移安全关键部分到在线后端系统(但是在与卡通信期间通常需要连续的网络访问)。
当然,还有另一种方法是在设备中使用本地安全元素,但这将要求您有权访问它,这通常不容易/不可能。
| 归档时间: |
|
| 查看次数: |
1592 次 |
| 最近记录: |