第26章:Keystore与SE:eSE、UICC、SD卡SE、SE访问控制、GP规范兼容性
聊到Android安全,绕不开一个硬件——SE(安全元件)。说白了,SE就是一个独立的安全岛,专门干加密、签名、存密钥这些脏活累活。我最早接触SE是在做金融类App的时候,那时候才意识到,光靠软件加密,根本扛不住系统层的攻击。
这一章,我们就把SE的几种形态、访问控制、以及GP规范的兼容性,一次性讲透。
26.1 SE的三种主流形态
SE不是只有一种样子。根据部署位置和用途,我把它分成三类:eSE、UICC、SD卡SE。你想想看,这三种形态,本质上都是把安全计算环境隔离出来,但实现方式完全不同。
| 形态 | 部署位置 | 典型场景 | 我遇到的坑 |
|---|---|---|---|
| eSE | 焊在主板上 | Google Pixel、高端旗舰机 | eSE一旦损坏,整块主板报废 |
| UICC | SIM卡内 | 运营商支付、NFC-SIM | 换卡后密钥全丢,用户骂街 |
| SD卡SE | MicroSD卡内 | 低端手机、IoT设备 | 用户拔卡后App直接崩溃 |
26.2 eSE:最正统的安全元件
eSE是Embedded SE的缩写,直接焊在主板上。它和主CPU通过SPI或I2C通信,物理上独立。我个人习惯把eSE叫做“硬件保险箱”——你砸了手机都拿不到里面的密钥。
为什么eSE最安全?因为它有独立的CPU、RAM、ROM,甚至有自己的操作系统(通常是Java Card OS)。主CPU上的Android系统被攻破了,eSE里的密钥依然安全。我在项目中遇到过,某厂商的TEE被提权攻破,但eSE里的支付密钥纹丝不动。
核心要点:eSE的密钥生成、存储、运算全部在SE内部完成,主CPU只能通过APDU指令请求服务,无法直接读取密钥明文。
26.3 UICC:SIM卡里的SE
UICC就是咱们手机里的SIM卡。它本身就是一个智能卡,有独立的CPU和存储。运营商很早就在SIM卡里集成了SE功能,主要用于NFC支付和身份认证。
嗯,这里要注意:UICC的SE受运营商控制。你想想看,如果App要使用UICC的SE,必须经过运营商的鉴权。我曾经帮一家银行对接某运营商的UICC SE,光签协议就花了三个月……
避坑指南:我曾经遇到过,用户更换SIM卡后,之前存储在UICC SE里的支付密钥全部丢失。解决方案是:重要密钥必须支持云端备份,或者使用eSE作为主SE,UICC作为辅助。
26.4 SD卡SE:灵活但脆弱
SD卡SE,就是把SE芯片集成在MicroSD卡里。这种方案在低端手机和IoT设备上很常见。优点是灵活——用户想换就换。缺点是——用户想拔就拔。
我记得有一次,某款智能门锁用了SD卡SE,用户为了扩容,把SD卡拔了换了一张。结果门锁直接变砖,因为开锁密钥存在旧卡里。后来我们强制要求:SD卡SE只能存临时会话密钥,主密钥必须存在eSE里。
26.5 SE访问控制:谁有资格用SE?
SE不是谁都能碰的。Android系统通过SE Access Control机制,严格控制App对SE的访问。说白了,就是一套白名单系统。
访问控制的流程大致如下:
- App发起SE连接请求
- SE服务检查App的签名证书
- 比对预置的访问规则(Access Rule)
- 匹配成功,建立安全通道;失败,直接拒绝
访问规则通常存储在SE内部,或者由系统服务管理。我建议你在开发时,提前向SE提供商申请访问权限,否则App连SE的门都摸不到。
小技巧:调试SE访问时,可以用adb shell dumpsys se查看当前的访问规则列表。我曾经靠这个命令,排查出一个签名证书过期导致的访问失败问题。
26.6 GP规范兼容性:SE的通用语言
GlobalPlatform(GP)规范,是SE领域的通用标准。无论是eSE、UICC还是SD卡SE,只要遵循GP规范,就能用统一的APDU指令进行管理。
GP规范主要定义了:
- 卡片管理器(Card Manager):SE的“操作系统”,负责安装、删除、更新Applet
- 安全域(Security Domain):每个Applet的隔离空间,有自己的密钥
- GP API:Java Card上的标准接口
我遇到过最头疼的问题,就是不同厂商的GP实现有细微差异。比如某厂商的SE,在安装Applet时必须指定内存大小,而另一家则自动分配。解决方案是:在开发阶段,针对目标SE做充分的兼容性测试。
26.7 知识体系总览
下面这张图,把SE的三种形态、访问控制、GP规范的关系串起来了。你一看就明白。
26.8 实战建议
说了这么多,给你几条实在的建议:
- 优先用eSE:如果设备支持,eSE是最安全的选择。别为了省成本用SD卡SE,除非你能接受用户拔卡的风险。
- 做好降级方案:如果SE不可用(比如用户换了SIM卡),App要有备选方案,比如回退到TEE或者软件加密。
- 提前申请权限:SE访问控制很严格,开发前就要向SE提供商申请签名证书的白名单。我见过太多项目,开发完了才发现App连不上SE。
- 测试GP兼容性:不同厂商的GP实现有差异,务必在目标设备上做完整的APDU指令测试。
我的经验:调试SE时,多用opensc-tool和gppcscconnection这些工具。它们能帮你绕过Android的封装,直接和SE通信,定位问题快得多。
好了,SE这块的内容就讲到这里。记住一句话:SE是硬件安全的基础,但用不好就是摆设。下一章,我们聊聊Keystore与生物识别的结合,那又是另一番天地。
公众号:蓝海资料掘金营,微信deep3321