3、JCOP安全模型:安全域、安全通道、密钥管理、访问控制规则

聊到JCOP的安全模型,我脑子里第一个蹦出来的词就是“层层设防”。

你想想看,一张Java卡里可能同时跑着银行应用、公交卡应用、门禁应用。它们之间怎么隔离?密钥怎么存?通信怎么加密?

说白了,JCOP的安全模型就是一套“游戏规则”。它规定了谁可以访问什么资源,数据怎么传输,密钥怎么保管。

我个人习惯把这一章拆成四个核心模块来讲:安全域安全通道密钥管理访问控制规则。咱们一个一个来。

JCOP 安全模型核心架构 安全域 安全通道 密钥管理 访问控制 🔐 安全域:应用隔离 + 密钥容器 🔐 安全通道:SCP01/02/03 加密通信 🔐 密钥管理:Diversification + 安全存储 🔐 访问控制:GP API 权限 + 安全策略

3.1 安全域(Security Domain)

安全域是什么?你可以把它理解成卡上的“独立保险箱”。

每个应用(Applet)都挂在一个安全域下面。安全域负责管理这个应用的密钥、通信权限、生命周期。

我记得有一次做项目,客户要求把公交和门禁放在同一张卡上。如果没做好安全域隔离,公交应用就能读到门禁的密钥——这显然不行。

安全域的核心职责:

  • 密钥容器:存储应用相关的密钥(加密密钥、MAC密钥、DEK密钥)
  • 通信代理:负责与外部实体(比如发卡系统)建立安全通道
  • 生命周期管理:控制应用从安装到删除的整个流程
  • 权限委派:可以授权其他安全域执行特定操作

这里有个关键点:ISD(Issuer Security Domain)是卡上的根安全域。它拥有最高权限,可以创建其他安全域。

💡 实战小技巧:

我曾经在测试中发现,有些卡片ISD的默认密钥没改。攻击者直接用默认密钥就能加载恶意Applet。所以,上线前第一件事——改掉ISD的默认密钥!

3.2 安全通道(Secure Channel)

安全通道,说白了就是卡和外部世界之间的“加密隧道”。

JCOP支持多种安全通道协议,最常见的是SCP01、SCP02、SCP03。

协议 加密算法 特点 安全性
SCP01 DES/3DES 老协议,兼容性好 较低(已不建议使用)
SCP02 3DES + MAC 支持显式/隐式认证 中等
SCP03 AES 支持双向认证 + 抗重放 高(推荐)

为什么要有安全通道?你想想看,APDU指令在卡和读卡器之间传输。如果不加密,攻击者用一根导线就能窃听所有数据。

⚠️ 避坑指南:

我曾经遇到过一张卡,虽然支持SCP03,但默认配置允许降级到SCP01。攻击者可以强制协商到弱协议,然后暴力破解密钥。所以,一定要在卡片个人化阶段禁用弱协议

3.3 密钥管理(Key Management)

密钥管理是安全模型的心脏。密钥一旦泄露,整个安全体系就崩塌了。

JCOP的密钥管理有几个关键点:

  • 密钥派生(Key Diversification):每张卡的密钥都不一样。即使你破解了一张卡,也拿不到其他卡的密钥。
  • 安全存储:密钥存放在安全域内部,Applet代码无法直接读取。
  • 密钥版本:支持多版本密钥轮换,旧密钥过期后自动失效。

密钥派生示例(伪代码):

// 主密钥 MK
// 卡片唯一标识 UID
// 派生密钥 DK = AES(MK, UID || 0x00)

byte[] mk = {0x01, 0x02, ...};  // 主密钥
byte[] uid = card.getUID();     // 卡片UID
byte[] dk = AES_encrypt(mk, uid + 0x00);  // 派生

嗯,这里要注意:派生算法不能太简单。我见过有人直接用UID拼接主密钥,结果被侧信道攻击一把梭。建议用CMAC或HMAC做派生。

3.4 访问控制规则(Access Control Rules)

访问控制规则决定了“谁可以做什么”。

在JCOP里,访问控制是通过安全策略(Security Policy)ACL(Access Control List)实现的。

举个例子:

  • Applet A 可以访问文件 X,但不能访问文件 Y
  • 只有经过安全通道认证的实体才能执行 DELETE 命令
  • 某些敏感操作需要双人授权(Dual Control)

💡 我个人的经验:

很多安全漏洞出在“过度授权”上。比如给一个普通Applet赋予了“加载其他Applet”的权限。攻击者只要攻破这个Applet,就能在卡上为所欲为。

我的建议是:最小权限原则。每个Applet只给它能完成工作所需的最小权限集。

3.5 安全模型实战要点

最后,我总结几个实战中容易踩的坑:

  1. 默认密钥:ISD和SD的默认密钥一定要改。我见过太多案例,攻击者用默认密钥直接加载恶意Applet。
  2. 安全通道降级:确保卡片只支持SCP03,或者至少禁用SCP01。
  3. 密钥泄露:密钥派生因子要包含卡片唯一信息,防止批量破解。
  4. 权限检查:每个API调用都要做权限校验,不能依赖Applet自觉。

⚠️ 重要提醒:

我曾经在渗透测试中,通过侧信道攻击成功提取了某张卡的DEK密钥。原因是密钥存储区域没有做物理防护。所以,安全模型不只是软件层面的,硬件防护同样重要

好了,这一章的内容就到这里。安全域、安全通道、密钥管理、访问控制规则——这四个模块构成了JCOP安全模型的骨架。理解它们,你就能看懂JCOP的安全设计思路。


专注资料整理