第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的访问。说白了,就是一套白名单系统。

访问控制的流程大致如下:

  1. App发起SE连接请求
  2. SE服务检查App的签名证书
  3. 比对预置的访问规则(Access Rule)
  4. 匹配成功,建立安全通道;失败,直接拒绝

访问规则通常存储在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规范的关系串起来了。你一看就明白。

SE安全元件知识体系 安全元件 (SE) eSE(嵌入式) UICC(SIM卡) SD卡SE 独立CPU/内存 焊在主板上 受运营商控制 可插拔 灵活但脆弱 用户可更换 SE访问控制(白名单) GP规范兼容性 三种SE形态共享相同的访问控制和GP规范体系

26.8 实战建议

说了这么多,给你几条实在的建议:

  • 优先用eSE:如果设备支持,eSE是最安全的选择。别为了省成本用SD卡SE,除非你能接受用户拔卡的风险。
  • 做好降级方案:如果SE不可用(比如用户换了SIM卡),App要有备选方案,比如回退到TEE或者软件加密。
  • 提前申请权限:SE访问控制很严格,开发前就要向SE提供商申请签名证书的白名单。我见过太多项目,开发完了才发现App连不上SE。
  • 测试GP兼容性:不同厂商的GP实现有差异,务必在目标设备上做完整的APDU指令测试。

我的经验:调试SE时,多用opensc-toolgppcscconnection这些工具。它们能帮你绕过Android的封装,直接和SE通信,定位问题快得多。

好了,SE这块的内容就讲到这里。记住一句话:SE是硬件安全的基础,但用不好就是摆设。下一章,我们聊聊Keystore与生物识别的结合,那又是另一番天地。


公众号:蓝海资料掘金营,微信deep3321