RFID 卡编程加密安全
RFID card programming cryptographically secure
我正在尝试开发一种自定义加密安全协议,用于通过 RFID 智能卡进行身份验证,我在互联网上所能找到的只是关于如何将静态标签写入卡中的一般信息。
对于我的项目,我需要 reader 向卡发送挑战随机数(固定长度的随机字节),然后卡应发回使用硬编码密钥(例如 AES CBC)加密的挑战或哈希 HMAC。
问题是:我怎样才能对卡进行编程以实现这种行为?我可以写代码这样做,但是如何"flash"把它传到网卡上。 reader 的代码也不是问题(我想使用带有 reader 模块的 Arduino)。
然后有足够功率的无源芯片来进行这种计算,或者考虑到距离只有几厘米,比如在门后,最好使用有源芯片?
被动标签无法做到这一点。那些只是保存他们吐出的序列号。
您需要一些更智能的卡。您基本上有两个选择:
1) 选择适合您需求的通用卡
您描述的身份验证方案使用非常广泛,几乎所有通用智能卡都采用了这种方案,无论是接触式还是非接触式 (RF) 接口(或两者都有)。如果你这样做,你不需要用你自己的代码对卡进行编程,你只需要获取规格并通过发送适当的命令用你想要的键值初始化卡。实际上,对于这些卡,通常可以使用通用工具对其进行初始化。简单。
Mifare(NXP),例如,使用非常广泛,容易获得,而且卡很便宜(缺点:它肯定不是有史以来最安全的卡)。您可以使用 Mifare Classic - 具有专有的 NXP 安全协议 - 规格 here (be careful, the reader must be compatible) or Mifare UltraLight C, with open 3DES crypto - specs here。还有其他变体(例如使用 AES 的 Mifare Plus)。只是不要选择不提供身份验证方法的简单 Mifare Ultralight。你会看到对于所有这些类型的卡,都有一个内置的认证方案可以在功能上满足你的需求(它实际上是一种相互认证,所以它比你需要的更多,但没关系)。
FeliCa(索尼制造)、ACOS3(ACS 制造 - 规格 here)是其他可能性,尽管我不太熟悉。
2) 获取可编程卡片
有一些,但不是很容易找到非接触式的,而且它们非常昂贵。您可以查找:
BasicCard (ZeitControl),存在双界面。这些卡在 Basic 中是可编程的,并且有一些可用的工具包(但我也不熟悉)。
JavaCard(任何制造商),这是一个标准,但对于小批量很难找到。不过,一些网上商店似乎有一些。这些卡在 Java 中是可编程的(实际上是 Java 的子集)。有可用于开发阶段的工具(例如,来自 Oracle,甚至作为 Eclipse 插件)。然后,为了在智能卡中加载自定义小程序,您需要熟悉 GlobalPlatform,这是另一个(公开可用的)标准,描述了应用程序在智能卡中的管理方式。不过,这太宽泛了,无法在这里详细描述。网上可以找资源,但是这条路肯定是最难的。
请注意,NFC 只是描述了通信方式,并没有说明另一端可用的智能。
需要更多情报(您似乎要寻找的命令在 ISO 7816-4 中称为 EXTERNAL AUTHENTICATE),但对您的范围问题没有帮助,因为较弱的领域,可用的功率越少。通过门进行通信的想法只适用于非常薄弱的门,高科技电子保护不会提高整体安全性。标准场强可达到的最大距离(心脏起搏器和类似设备对此有限制),之间只有空气,通常足以达到 10 厘米左右。所以对我来说,你的 reader 似乎必须在外面,并且需要进行机械加固以防止篡改。
(有帮助的是 "card" 有自己的电源,所以磁场只需要通信。据我所知,这主要是由一种外部套筒提供的。)
dim 没有提到的是所谓的 原生卡 的产品组,这些产品通常只有在重要的制造商支持下才能编程(保密协议,可能涉及费用) ,但幸运的是已经包含大多数用例的功能,在您的情况下,命令 Get Challenge 和 External Authenticate.
我正在尝试开发一种自定义加密安全协议,用于通过 RFID 智能卡进行身份验证,我在互联网上所能找到的只是关于如何将静态标签写入卡中的一般信息。 对于我的项目,我需要 reader 向卡发送挑战随机数(固定长度的随机字节),然后卡应发回使用硬编码密钥(例如 AES CBC)加密的挑战或哈希 HMAC。
问题是:我怎样才能对卡进行编程以实现这种行为?我可以写代码这样做,但是如何"flash"把它传到网卡上。 reader 的代码也不是问题(我想使用带有 reader 模块的 Arduino)。
然后有足够功率的无源芯片来进行这种计算,或者考虑到距离只有几厘米,比如在门后,最好使用有源芯片?
被动标签无法做到这一点。那些只是保存他们吐出的序列号。
您需要一些更智能的卡。您基本上有两个选择:
1) 选择适合您需求的通用卡
您描述的身份验证方案使用非常广泛,几乎所有通用智能卡都采用了这种方案,无论是接触式还是非接触式 (RF) 接口(或两者都有)。如果你这样做,你不需要用你自己的代码对卡进行编程,你只需要获取规格并通过发送适当的命令用你想要的键值初始化卡。实际上,对于这些卡,通常可以使用通用工具对其进行初始化。简单。
Mifare(NXP),例如,使用非常广泛,容易获得,而且卡很便宜(缺点:它肯定不是有史以来最安全的卡)。您可以使用 Mifare Classic - 具有专有的 NXP 安全协议 - 规格 here (be careful, the reader must be compatible) or Mifare UltraLight C, with open 3DES crypto - specs here。还有其他变体(例如使用 AES 的 Mifare Plus)。只是不要选择不提供身份验证方法的简单 Mifare Ultralight。你会看到对于所有这些类型的卡,都有一个内置的认证方案可以在功能上满足你的需求(它实际上是一种相互认证,所以它比你需要的更多,但没关系)。
FeliCa(索尼制造)、ACOS3(ACS 制造 - 规格 here)是其他可能性,尽管我不太熟悉。
2) 获取可编程卡片
有一些,但不是很容易找到非接触式的,而且它们非常昂贵。您可以查找:
BasicCard (ZeitControl),存在双界面。这些卡在 Basic 中是可编程的,并且有一些可用的工具包(但我也不熟悉)。
JavaCard(任何制造商),这是一个标准,但对于小批量很难找到。不过,一些网上商店似乎有一些。这些卡在 Java 中是可编程的(实际上是 Java 的子集)。有可用于开发阶段的工具(例如,来自 Oracle,甚至作为 Eclipse 插件)。然后,为了在智能卡中加载自定义小程序,您需要熟悉 GlobalPlatform,这是另一个(公开可用的)标准,描述了应用程序在智能卡中的管理方式。不过,这太宽泛了,无法在这里详细描述。网上可以找资源,但是这条路肯定是最难的。
请注意,NFC 只是描述了通信方式,并没有说明另一端可用的智能。
需要更多情报(您似乎要寻找的命令在 ISO 7816-4 中称为 EXTERNAL AUTHENTICATE),但对您的范围问题没有帮助,因为较弱的领域,可用的功率越少。通过门进行通信的想法只适用于非常薄弱的门,高科技电子保护不会提高整体安全性。标准场强可达到的最大距离(心脏起搏器和类似设备对此有限制),之间只有空气,通常足以达到 10 厘米左右。所以对我来说,你的 reader 似乎必须在外面,并且需要进行机械加固以防止篡改。
(有帮助的是 "card" 有自己的电源,所以磁场只需要通信。据我所知,这主要是由一种外部套筒提供的。)
dim 没有提到的是所谓的 原生卡 的产品组,这些产品通常只有在重要的制造商支持下才能编程(保密协议,可能涉及费用) ,但幸运的是已经包含大多数用例的功能,在您的情况下,命令 Get Challenge 和 External Authenticate.