使 JavaCard 小程序可更新的正确方法是什么?

问题描述

我希望能够在分发给客户后更新 Applet。 如果我们需要更新小程序,我不想让他们把芯片寄给我。 我想给一个脚本在他们的读卡器中运行。

问题是为了更新小程序,我需要给他们一个带有解锁密钥的脚本,但我不想给他们密钥。

有什么办法可以对一个新的小程序进行签名,JavaCard(GlobalPlatform)会知道它是一个原始的小程序,然后才会安装?

我想也许可以创建具有安装权限的新 Applet(有类似的东西吗?)并且它将负责安装新的 Applet。

解决方法

您有多种选择:

  1. 如果您的卡支持 SCP11c,您可以创建卡外脚本。这样您就可以将安装脚本发送给您的客户端。但是我没有听说有支持这种模式的卡,我也没有搜索过。

    1. 您使用经典的 SCP02/SCP03 为您的小程序创建了一个专用安全域。您仍然需要提供该域的密钥,但您的客户端至少不能再与其他安全域中的其他数据交互。如果该卡仅用于一个租户,您仍然可以使用发行者安全域。卡必须支持这个,可能不支持。
    2. 为了防止您的客户端安装任意内容,您可以使用 DAP 验证。安全域必须具有此特权,并且必须为其配备一个密钥。 DAP 验证将签名附加到您的小程序数据上,该签名由安全域检查。必须匹配,否则无法安装小程序。卡必须支持这个,可能不支持。您也可以将“安装令牌”用于类似目的,同时检查所有安装参数。
    3. 为了防止您的代码被检查 - 它是字节码并且仍然可以揭示您正在做的事情,尽管它很难阅读 - 您可以加密小程序代码。加密加载文件块是在规范中查找的术语,您必须再次将此权限授予安全域。
  2. 设置支持远程内容管理的服务器。您必须为您的客户端提供代理实现,在读卡器和您的服务器之间代理 APDU 数据。 GP RAM specification 描述了这样一个系统,但您也可以使用自己的(更简单的)实现。您的服务器必须组装所有 APDU 命令,将其发送到代理,代理将提供 APDU 响应。您可以在引擎盖下使用 PC/SC 和 a remote smart card 一起使用标准工具。例如。我写了GPShell,也许可以和它一起使用。但是,除了将脚本工具放在一起之外,您还可以将其实现为真正的服务器,例如将 custom connection pluginGlobalPlatform 一起使用。如果您在 Java 环境中进行开发,还有可用的 Java 库可能会更方便。这种方法是最灵活的方法,并且还为您的客户提供了一种方便的方式来通知更新。

检查 GP 2.3.1 以获取有关我给出的提示的更多信息。这完全取决于您的卡支持什么,以及您是否可以找到一些也支持此功能的工具和库。

,

(扩展 answer given by k_o_

  1. 使用带有伪随机质询的安全通道协议,引用 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 的概念验证实现,效果很好)


  1. 如果您的更新只会更改小程序逻辑的一小部分(并且您提前知道哪些部分),那么您可以:
  • 通过远程更改配置使这些部件可配置并执行更新

  • 实现一个虚拟机来执行这些部分并远程更新其字节码

(我在 Java Card 小程序中实现了一个简单的虚拟机,性能足以完成简单的加密任务)


一些附加说明:

  • 使用 APDU 代理(k_o_ 答案中的选项 3)--使用具有完整性和机密性的安全通道(如果可能,包括 R-MAC)--如果没有应用适当的保护,讨厌的 MITM 攻击是可能的(假设发生了更新)在不安全的环境中)

  • 如果您的小程序实例包含任何需要跨更新保留的状态信息(数据),它会变得更加复杂

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...