Locking/unlocking 智能卡和安全隐患

Locking/unlocking a smartcard & security implications

我已经开始使用 javacard 为智能卡开发小程序。 编译小程序时,必须通过全球平台规范 (https://globalplatform.org/wp-content/uploads/2018/05/GPC_CardSpecification_v2.3.1_PublicRelease_CC.pdf) 中定义的安全协议将其加载到 javacard。

特别是,将小程序加载到卡上需要知道用于在主机和智能卡之间设置安全通道的密钥。空白卡通常带有默认密钥,例如“404142434445464748494A4B4C4D4E4F”。要 'lock' 卡并确保它不会被篡改,必须将这些密钥更改为只有发卡行知道的密钥。

我的问题如下: 使用默认测试密钥发卡有什么风险?

以下是我能想到的威胁列表:

还有其他威胁吗?特别是,是否可以恢复存储在已安装在卡上的小程序中的敏感数据(例如加密密钥)?

我想了解使用带有安全通道默认密钥的智能卡的确切安全隐患。

applet 的数据应该受到根据 Java Card Runtime Specification (JCRE) 第 6 章:“Applet 隔离和对象共享”实施的“防火墙”的保护:

The Java Card technology-based firewall (Java Card firewall) provides protection against the most frequently anticipated security concern: developer mistakes and design oversights that might allow sensitive data to be “leaked” to another applet. An applet may be able to obtain an object reference from a publicly accessible location. However, if the object is owned by an applet protected by its own firewall, the requesting applet must satisfy certain access rules before it can use the reference to access the object.

The firewall also provides protection against incorrect code. If incorrect code is loaded onto a card, the firewall still protects objects from being accessed by this code.

要允许共享 class 必须实现 javacard.framework.Shareable 接口(6.2.6 可共享接口详细信息)。

请注意,如果允许不受信任的小程序 运行,攻击面会大大增加。无法满足安全约束的可能性肯定会增加。这些密钥被认为对 Java 卡安全至关重要,应始终更换默认密钥。如果您订购的卡数量较多,通常可以用客户特定的密钥替换默认密钥。

请注意,在撰写本文时,Oracle 站点已部分关闭,我无法访问文档。本文摘自我存储在个人计算机上的 3.0.1 规范。