无法克隆的 NFC 智能卡

NFC smartcard that is impossible to clone

首先,我要道歉。我在这方面完全是菜鸟,我的许多想法可能会产生误导。

我需要验证我的应用程序的用户在特定位置,以便获得执行操作的授权。我想为此目的使用 NFC。用户必须将他的智能手机放在 NFC 标签旁边才能获得执行该操作的授权。很简单,但我需要它能够合理地防止黑客攻击。这意味着如果不对 NFC 芯片周围的塑料造成物理损坏,NFC 标签就不可能被克隆。这也意味着 NFC 芯片不能只包含静态数据。 NFC 芯片必须包含一个应用程序,它可以接收一些数据(加密挑战)并使用安全的内置私钥(必须无法通过 NFC 接口读取)对其进行签名。当用户想要执行操作时,他会向服务器请求挑战,然后他让芯片对其进行签名,然后他将签名的挑战发送回服务器,服务器将使用已知的 public 密钥验证签名.这应该可以使用 NFC JavaCard 实现。但是这些 NFC JavaCards 真的存在吗?我找不到一家能够为我生产这种 NFC 标签的公司。当我试图向 NFC 标签生产商解释我的要求时,他看起来好像从未听说过 NFC JavaCards。我尝试了大约 10 个制作人,但都没有成功。

市面上常见的芯片能满足我的要求吗?我的意思是来自 Mifare 系列的芯片。我怀疑 Mifare DESfire 可能能够满足我的要求,但我不确定。

欢迎回复广告,因为相关广告正是我要找的:)

我尝试收集一些有用的事实:

  • NFC 是一个非常宽泛的术语,仅仅发现双方并不能确保互操作性。
  • 任何符合 ISO 14443(NFC 风格之一)且具有加密功能的智能卡都应该可用。请注意,具有原生 OS 的卡片可能是 JavaCard 的可行替代方案,因为签署随机数的功能非常标准。
  • 任何带有NFC芯片的智能phone原则上都可以访问这样的卡。不幸的是,这强烈依赖于智能 phone 的 OS,对于 Android,要使用的相关 class 是 IsoDep,它为您提供了 APDU 接口。触发 "card enters field" 事件后,应用程序会收到一个句柄,通过该句柄可以进行进一步的通信。
  • 无法克隆真正的智能卡,因为您无法丢弃它们;尤其是按键读不出来

现在要考虑一些事情:

  • 您的方法看起来很不寻常,这可能会成为一个问题。 (将便携式卡以某种方式固定在墙上,只是为了获取位置;所以你知道某人在哪里,但不知道是谁?虽然我不认为克隆是一个问题,但你必须以某种方式确保破坏,以防万一盗窃企图,这可能与下面的距离主题相冲突。)

  • 我不明白服务器在哪里发挥作用。如果不涉及授权行为,提供随机数不是充分理由。

  • 非对称密钥运算的功耗比较大,需要通过电场来供电。这严重限制了卡与 phone 之间的距离,甚至可能需要直接触摸。虽然它自己的电源原则上可以解决这个问题,但这并不是 ISO-14443 设计的目的。

是的,JavaCards 确实存在。

https://github.com/OpenJavaCard/openjavacard-ndef 是一个使这些 JavaCards 输出标准 NDEF 消息的项目(思想笔记问题 4,其中示例使用了错误的 APDU 但很容易更改)

这个项目还提供了一些卡片,它完全可以工作并经过测试

ACS ACOSJ - fully working
NXP JCOP J3D040/J3D081/J2E145 etc - fully working

ACS 和 Cardlogic 都做卡(只是 google 型号) 例如

https://www.acs.com.hk/en/products/405/acosj-java-card-combi/

https://www.smartcardfocus.com/shop/ilp/id~707/j3a081-80k/p/index.shtml

a 寻找的答案不是运行自定义代码的芯片。虽然这可能是可能的,但这绝对不是实现目标的最佳方式。

我一直在寻找能够使用 NFC 数据进行强身份验证的解决方案。可能有多个芯片提供此功能,但最可用的芯片可能是 NTAG 424 DNA TT。它是这样工作的:

  1. 芯片有内存,无法通过NFC读取。私钥存储在那里。
  2. 芯片有读计数器。每次通过 NFC 读取数据时它都会增加。
  3. 芯片可以在内存不可访问的部分使用私钥生成字符串UID(芯片序列号)+计数器的AES-128签名。
  4. 芯片可以将上述数据动态注入URL,存储在可读存储器中。

所以解决方案就像(我现在正在等待 NFC 标签的交付,所以我还不确定):

  1. 读取标签 UID(序列号)和实际计数器值(在未使用的标签上应为 0)
  2. 生成密钥对
  3. 加载私钥到芯片
  4. 加载一些数据(URL,例如:https://my.app/)到芯片
  5. 在服务器上存储 UID,public-key,last-counter
  6. 配置芯片将UID、计数器、签名注入存储在芯片上的URL

当客户端读取数据时,它们应该包含所需的变量,例如:https://my.app/?counter=1&uid=ff:ff:ff:ff&signature=xyz。然后在服务器上:

  1. 使用 uid 作为主键获取存储的信息(public-key,last-counter)
  2. 验证签名
  3. 验证必须> last-counter
  4. 的计数器
  5. 将计数器存储为最后一个计数器
  6. 授权成功

有没有人能够在不读取芯片的隐藏内存的情况下破解它,这需要对芯片进行物理篡改?