3、JCOP安全模型:安全域、安全通道、密钥管理、访问控制规则
聊到JCOP的安全模型,我脑子里第一个蹦出来的词就是“层层设防”。
你想想看,一张Java卡里可能同时跑着银行应用、公交卡应用、门禁应用。它们之间怎么隔离?密钥怎么存?通信怎么加密?
说白了,JCOP的安全模型就是一套“游戏规则”。它规定了谁可以访问什么资源,数据怎么传输,密钥怎么保管。
我个人习惯把这一章拆成四个核心模块来讲:安全域、安全通道、密钥管理、访问控制规则。咱们一个一个来。
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 安全模型实战要点
最后,我总结几个实战中容易踩的坑:
- 默认密钥:ISD和SD的默认密钥一定要改。我见过太多案例,攻击者用默认密钥直接加载恶意Applet。
- 安全通道降级:确保卡片只支持SCP03,或者至少禁用SCP01。
- 密钥泄露:密钥派生因子要包含卡片唯一信息,防止批量破解。
- 权限检查:每个API调用都要做权限校验,不能依赖Applet自觉。
⚠️ 重要提醒:
我曾经在渗透测试中,通过侧信道攻击成功提取了某张卡的DEK密钥。原因是密钥存储区域没有做物理防护。所以,安全模型不只是软件层面的,硬件防护同样重要。
好了,这一章的内容就到这里。安全域、安全通道、密钥管理、访问控制规则——这四个模块构成了JCOP安全模型的骨架。理解它们,你就能看懂JCOP的安全设计思路。