问题描述
我希望能够在分发给客户后更新 Applet。 如果我们需要更新小程序,我不想让他们把芯片寄给我。 我想给一个脚本在他们的读卡器中运行。
问题是为了更新小程序,我需要给他们一个带有解锁密钥的脚本,但我不想给他们密钥。
有什么办法可以对一个新的小程序进行签名,JavaCard(GlobalPlatform)会知道它是一个原始的小程序,然后才会安装?
我想也许可以创建具有安装权限的新 Applet(有类似的东西吗?)并且它将负责安装新的 Applet。
解决方法
您有多种选择:
-
如果您的卡支持 SCP11c,您可以创建卡外脚本。这样您就可以将安装脚本发送给您的客户端。但是我没有听说有支持这种模式的卡,我也没有搜索过。
-
- 您使用经典的 SCP02/SCP03 为您的小程序创建了一个专用安全域。您仍然需要提供该域的密钥,但您的客户端至少不能再与其他安全域中的其他数据交互。如果该卡仅用于一个租户,您仍然可以使用发行者安全域。卡必须支持这个,可能不支持。
- 为了防止您的客户端安装任意内容,您可以使用 DAP 验证。安全域必须具有此特权,并且必须为其配备一个密钥。 DAP 验证将签名附加到您的小程序数据上,该签名由安全域检查。必须匹配,否则无法安装小程序。卡必须支持这个,可能不支持。您也可以将“安装令牌”用于类似目的,同时检查所有安装参数。
- 为了防止您的代码被检查 - 它是字节码并且仍然可以揭示您正在做的事情,尽管它很难阅读 - 您可以加密小程序代码。加密加载文件块是在规范中查找的术语,您必须再次将此权限授予安全域。
-
设置支持远程内容管理的服务器。您必须为您的客户端提供代理实现,在读卡器和您的服务器之间代理 APDU 数据。 GP RAM specification 描述了这样一个系统,但您也可以使用自己的(更简单的)实现。您的服务器必须组装所有 APDU 命令,将其发送到代理,代理将提供 APDU 响应。您可以在引擎盖下使用 PC/SC 和 a remote smart card 一起使用标准工具。例如。我写了GPShell,也许可以和它一起使用。但是,除了将脚本工具放在一起之外,您还可以将其实现为真正的服务器,例如将 custom connection plugin 与 GlobalPlatform 一起使用。如果您在 Java 环境中进行开发,还有可用的 Java 库可能会更方便。这种方法是最灵活的方法,并且还为您的客户提供了一种方便的方式来通知更新。
检查 GP 2.3.1 以获取有关我给出的提示的更多信息。这完全取决于您的卡支持什么,以及您是否可以找到一些也支持此功能的工具和库。
,(扩展 answer given by k_o_)
- 使用带有伪随机质询的安全通道协议,引用 GP 2.2。修正 D:
安全通道用于在发行时和发行后对卡片进行个性化设置。的模式 使用伪随机卡挑战的安全通道协议允许离线准备 卡片不存在时的个性化脚本,并且在卡片上处理这些脚本时 与准备脚本的实体的在线连接。
我知道的选项是:
-
带有“i”参数的SCP02设置了“b7”(通常为“i=55”)——参见例如GP 卡规范 2.3.1,E1.1 和 E.4.2.3 部分
-
带有“i”参数的SCP03设置了“b5”——参见例如GP 卡规范 2.2 修正案 D,第 4.1.5、6.2.2.1 节
您需要为所有已部署的卡片存储额外信息(至少是计数器值)。
(如果我没记错的话)您需要为每张部署的卡生成唯一的脚本(假设使用了不同的卡密钥)。
请注意,可能会发生一些令人讨厌的 MITM 攻击(例如,提前终止个性化脚本)。
(我有一个 SCP02 i=55 的概念验证实现,效果很好)
- 如果您的更新只会更改小程序逻辑的一小部分(并且您提前知道哪些部分),那么您可以:
-
通过远程更改配置使这些部件可配置并执行更新
-
实现一个虚拟机来执行这些部分并远程更新其字节码
(我在 Java Card 小程序中实现了一个简单的虚拟机,性能足以完成简单的加密任务)
一些附加说明:
-
使用 APDU 代理(k_o_ 答案中的选项 3)--使用具有完整性和机密性的安全通道(如果可能,包括 R-MAC)--如果没有应用适当的保护,讨厌的 MITM 攻击是可能的(假设发生了更新)在不安全的环境中)
-
如果您的小程序实例包含任何需要跨更新保留的状态信息(数据),它会变得更加复杂