发送数据,使用 HCE,还是使用安全元素? (Android,科特林,Mifare 1k)
Sending data, using HCE, or using secure element? (Android, Kotlin, Mifare 1k)
我正在尝试实现模拟 Mifare One(1K/S50,ISO14443A)芯片的功能,以便能够使用具有 NFC 功能的 phone 而不是物理 Mifare 卡 或者,如果可能的话 仅将数据发送到 reader。
我有这种reader/writer:https://www.evelta.com/er302-high-frequency-nfc-writer-usb/
在论坛和 Whosebug 问题上四处寻找后,我发现这篇文章是最好的例子:
我实现了 HCE 部分,运行 程序,reader 相信我的 phone 是 Mifare 芯片,到目前为止一切顺利。
我的问题:
无论我尝试使用什么“标准”身份验证密钥...它都会给我身份验证错误。我阅读了有关 Auth 的问题:Authentication failure for Mifare 1K NFC tag using ACR122U NFC reader,它适用于物理 Mifare 卡...但我不知道如何设置或了解模拟卡的密钥。
我不明白为什么这个例子模拟了确切的 Mifare 芯片类型......即使断点在 APDUService 中也不起作用,但是 reader 以某种方式检测到 Mifare 便宜。
阅读之后,我明白我不能 100% 模拟物理卡,所以我必须以某种方式在我的 APDU 响应中用服务发送我想要的所有数据(我相信这是收发部分)。
然而我什至无法验证。
我试图寻找其他可能的解决方案:
AndroidBeam: Android - Android p2p...听起来很简单,比较高级API,但是它正在被弃用,而且不能保证reader甚至会使用Android。 ..它可能是 'simple' USB reader 硬件,就像我使用的那样。
SecureElement:具有讽刺意味的是...它似乎是最受推荐的,我读到“是的,mifare 是可能的”之类的东西, 还我找不到很好的例子,官方Google文档也没有很好的例子。我读到它适用于“ISO/IEC 7816-4”,但 Mifare 1K 是 ISO14443A,所以我对这个 API.
有点怀疑
"简单地" 将数据发送到 reader: 如果我可以简单地"在读取 phone 时将数据推送到 reader 而不会使问题复杂化或模拟任何东西......这会很棒,但我不知道它是否可能。整个NFC话题似乎越来越复杂了。
总而言之,我只需要做一件事:获取数据并将其发送到 reader。
我意识到这是一个像幻想一样的童话故事,相信它听起来很简单,不过,我希望有办法做到。
如果我可以自己发送数据,而不用模拟 Mifare 或任何东西...毕竟重要的是卡上的数据,而不是芯片的类型,解决方案越简单,越多越好。
对于可能出现的英语语法错误,我们深表歉意。
问题是您不能在 Android 上使用 HCE 来模拟 Mifare Classic 1K (https://www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf) as this is a custom Type NFC card. As HCE is about emulating Type 4 cards. See 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 reader 提供其他卡类型的 reader 仿真但不是 HCE,其中主机进行仿真而不是 NFC 硬件。
Type 4 卡或模拟卡的身份验证处理方式不同。
您可以模拟 MIFARE DESFire 卡,因为它是 Type 4 卡。
您的卡 reader 的规格没有很好的记录,它看起来非常“精简”,并且它不支持与非 Mifare Classic 卡通信所需的任何更高级别的协议。它可以支持它们,但由于 Mifare 协议是原始规范,因此它可能是旧设计并且仅支持 Mifare 协议。
我正在尝试实现模拟 Mifare One(1K/S50,ISO14443A)芯片的功能,以便能够使用具有 NFC 功能的 phone 而不是物理 Mifare 卡 或者,如果可能的话 仅将数据发送到 reader。
我有这种reader/writer:https://www.evelta.com/er302-high-frequency-nfc-writer-usb/
在论坛和 Whosebug 问题上四处寻找后,我发现这篇文章是最好的例子:
我实现了 HCE 部分,运行 程序,reader 相信我的 phone 是 Mifare 芯片,到目前为止一切顺利。
我的问题:
无论我尝试使用什么“标准”身份验证密钥...它都会给我身份验证错误。我阅读了有关 Auth 的问题:Authentication failure for Mifare 1K NFC tag using ACR122U NFC reader,它适用于物理 Mifare 卡...但我不知道如何设置或了解模拟卡的密钥。
我不明白为什么这个例子模拟了确切的 Mifare 芯片类型......即使断点在 APDUService 中也不起作用,但是 reader 以某种方式检测到 Mifare 便宜。
阅读之后,我明白我不能 100% 模拟物理卡,所以我必须以某种方式在我的 APDU 响应中用服务发送我想要的所有数据(我相信这是收发部分)。
然而我什至无法验证。
我试图寻找其他可能的解决方案:
AndroidBeam: Android - Android p2p...听起来很简单,比较高级API,但是它正在被弃用,而且不能保证reader甚至会使用Android。 ..它可能是 'simple' USB reader 硬件,就像我使用的那样。
SecureElement:具有讽刺意味的是...它似乎是最受推荐的,我读到“是的,mifare 是可能的”之类的东西, 还我找不到很好的例子,官方Google文档也没有很好的例子。我读到它适用于“ISO/IEC 7816-4”,但 Mifare 1K 是 ISO14443A,所以我对这个 API.
有点怀疑"简单地" 将数据发送到 reader: 如果我可以简单地"在读取 phone 时将数据推送到 reader 而不会使问题复杂化或模拟任何东西......这会很棒,但我不知道它是否可能。整个NFC话题似乎越来越复杂了。
总而言之,我只需要做一件事:获取数据并将其发送到 reader。
我意识到这是一个像幻想一样的童话故事,相信它听起来很简单,不过,我希望有办法做到。
如果我可以自己发送数据,而不用模拟 Mifare 或任何东西...毕竟重要的是卡上的数据,而不是芯片的类型,解决方案越简单,越多越好。
对于可能出现的英语语法错误,我们深表歉意。
问题是您不能在 Android 上使用 HCE 来模拟 Mifare Classic 1K (https://www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf) as this is a custom Type NFC card. As HCE is about emulating Type 4 cards. See 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 reader 提供其他卡类型的 reader 仿真但不是 HCE,其中主机进行仿真而不是 NFC 硬件。
Type 4 卡或模拟卡的身份验证处理方式不同。
您可以模拟 MIFARE DESFire 卡,因为它是 Type 4 卡。
您的卡 reader 的规格没有很好的记录,它看起来非常“精简”,并且它不支持与非 Mifare Classic 卡通信所需的任何更高级别的协议。它可以支持它们,但由于 Mifare 协议是原始规范,因此它可能是旧设计并且仅支持 Mifare 协议。