发送数据、使用 HCE 还是使用安全元件?(Android、Kotlin、Mifare 1k)

ata*_*nii 1 nfc mifare nfc-p2p hce secure-element

我正在尝试实现模拟 Mifare One(1K/S50,ISO14443A)芯片的功能,以便能够使用具有 NFC 功能的手机而不是物理 Mifare 卡,或者如果可能的话,仅将数据发送到读卡器。

我有这种类型的阅读器/写入器:https://www.evelta.com/er302-high-Frequency-nfc-writer-usb/

在浏览了论坛、stackoverflow 问题后,我发现这篇文章是最好的例子:

https://medium.com/the-almanac/how-to-build-a-simple-smart-card-emulator-reader-for-android-7975fae4040f

我实现了 HCE 部分,运行程序,读者相信我的手机是 Mifare 芯片,到目前为止一切顺利。

我的问题:

  • 无论我尝试使用什么“标准”身份验证密钥......它都会给我身份验证错误。我阅读了有关 Auth: Authentication failure for Mifare 1K NFC tag using ACR122U NFC reader 的问题,它适用于物理 Mifare 卡...但我不知道如何设置或了解模拟卡的密钥。

  • 我不明白为什么这个例子模拟了确切的 Mifare 芯片类型……即使断点在 APDUService 中也不起作用,但读者会以某种方式检测到便宜的 Mifare。

阅读完相关内容后,我发现我无法 100% 模拟物理卡,因此我必须以某种方式通过服务发送 APDU 响应中我想要的所有数据(我相信这是收发部分)。

但我什至无法验证。

我尝试寻找其他可能的解决方案:

  • AndroidBeam:Android - Android p2p...听起来很简单,相对高级的 API,它已被弃用,而且不能保证读者甚至会使用 Android...它可能是一个“简单”的 USB 读卡器硬件,例如我用。

  • SecureElement:具有讽刺意味的是......它似乎是最推荐的,我读到“是的,mifare 是可能的”之类的东西,我找不到它的一个很好的例子,而且官方的 Google 文档也没有任何好的例子。我读到它适用于“ISO/IEC 7816-4”,但 Mifare 1K 是 ISO14443A,所以我对此 API 有点怀疑。

  • 简单地”将数据发送给阅读器:如果我可以在阅读器读取手机时简单地将数据“推送”给阅读器,而不会使事情复杂化或模拟任何东西......那就太好了,但我不知道是否可以这甚至是可能的。整个 NFC 主题似乎越来越复杂。

因此,我只需要做一件事:获取数据并将其发送给阅读器。

我意识到这是一个童话般的幻觉,相信它就像听起来那么简单,但我仍然希望有一种方法可以做到。

如果我可以自己发送数据,而不需要模拟 Mifare 或其他任何东西……毕竟重要的是卡上的数据,而不是芯片的类型,解决方案越简单越好。

很抱歉可能出现英语语法错误。

And*_*rew 5

问题是您无法在 Android 上使用 HCE 来模拟 Mifare Classic 1K ( https://www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf ),因为这是自定义类型 NFC 卡。因为 HCE 是关于模拟 Type 4 卡的。请参阅https://developer.android.com/guide/topics/connectivity/nfc/hce#SupportedProtocols

下图有助于理解这种类型。

在此输入图像描述

您可以从它的数据表中看到这一点,它没有任何地方谈论 AID 和标准 Type 4 NFC 命令

尽管类型 2 和类型 4 可以共享防冲突机制和读取 UID(这是该过程的一部分),但任何其他访问方法均不共享。

可供参考的 Type 4 规格位于http://apps4android.org/nfc-specifications/NFCForum-TS-Type-4-Tag_2.0.pdf

我见过一些 USB 读卡器提供其他卡类型的读卡器模拟,但不提供 HCE,其中主机进行模拟而不是 NFC 硬件。

类型 4 卡或模拟卡上的身份验证处理方式不同。

您可以模拟 MIFARE DESFire 卡,因为它是 4 类卡。

您的读卡器的规格没有很好的记录,它看起来非常“精简”,并且它不支持与非 Mifare Classic 卡通信所需的任何更高级别的协议。它可以支持它们,但由于 Mifare 协议是原始规范,因此它可能是旧设计并且仅支持 Mifare 协议。