1. 课程导入
在移动应用安全体系中,密钥是最敏感、最需要被保护的核心资产。无论是用户登录令牌、支付签名、本地数据库加密,还是设备间身份认证,一旦密钥被提取或滥用,整个安全链条都会崩塌。Android Keystore System 正是 Android 平台为开发者提供的硬件级密钥保护方案,它让应用可以在不暴露密钥明文的前提下完成加密、解密、签名和验证操作。本课程将围绕 Android Keystore 与密钥服务开发展开,从基础概念到工程落地,帮助学习者建立完整的密钥安全开发能力。
一、学习目标:从“会用API”到“懂安全边界”
本课程的学习目标分为四个层次。第一层是理解 Android Keystore 的定位:它不是普通的文件存储,而是一个由系统管理的密钥容器,密钥材料通常不会离开安全硬件或系统隔离区域。第二层是掌握核心 API 的使用,包括 KeyStore、KeyGenerator、KeyPairGenerator、KeyGenParameterSpec、Cipher、Signature 和 Mac 等。第三层是能够根据业务场景选择合适的密钥类型、加密算法、填充模式和用户认证策略。第四层是具备排障与安全复盘能力,能够识别常见误用,例如密钥导出、IV 复用、认证绑定缺失和降级攻击。
二、核心概念:密钥容器、硬件背书与认证绑定
Android Keystore 的核心思想是“密钥可用不可见”。应用通过别名(alias)引用密钥,系统在内部完成密钥生成、存储和密码学运算。密钥材料不会以明文形式返回给应用进程,从而降低被内存抓取、Root 提取或备份泄露的风险。其关键概念包括:
- 密钥别名(Alias):应用访问密钥的唯一标识,通常与业务用途绑定,如
payment_sign_key。 - 密钥库(KeyStore):系统级密钥容器,应用只能访问自己命名空间下的密钥。
- 硬件安全模块(HSM/TEE/StrongBox):部分设备支持将密钥运算放入可信执行环境或安全芯片,提升抗物理攻击能力。
- 用户认证绑定:通过
setUserAuthenticationRequired(true)要求密钥使用前必须通过锁屏、指纹或人脸认证。 - 密钥证明(Key Attestation):用于向服务端证明密钥确实由受信任硬件生成,并携带设备状态信息。
这些概念共同构成 Android 密钥服务的安全边界:密钥生成、存储、使用和证明四个环节相互配合,缺一不可。
三、方法流程:一次完整的密钥使用闭环
在工程实践中,Android Keystore 的使用通常遵循“生成—存储—使用—证明”的闭环流程。下面以生成一个用于 AES/GCM 加密的对称密钥为例,展示关键代码结构:
KeyGenerator keyGenerator = KeyGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
"local_db_key",
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setKeySize(256)
.setUserAuthenticationRequired(true)
.setInvalidatedByBiometricEnrollment(true)
.build();
keyGenerator.init(spec);
SecretKey secretKey = keyGenerator.generateKey();
生成后,密钥由系统托管。应用后续通过别名获取密钥并执行加密:
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
SecretKey key = (SecretKey) keyStore.getKey("local_db_key", null);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] iv = cipher.getIV();
byte[] cipherText = cipher.doFinal(plainText);
需要注意的是,GCM 模式下 IV 必须唯一且不可复用,通常将 IV 与密文一起存储。若密钥绑定了用户认证,则每次使用前需要触发 BiometricPrompt 或锁屏认证,认证通过后密钥才可被调用。
四、典型场景与误区复盘
Android Keystore 适用于多种安全场景。下表列出常见业务与推荐密钥策略:
| 业务场景 | 推荐算法 | 密钥类型 | 关键策略 |
|---|---|---|---|
| 本地数据库加密 | AES/GCM/NoPadding | 对称密钥 | 256 位密钥,IV 随机且随密文存储 |
| 支付请求签名 | SHA256withECDSA | 非对称密钥对 | 私钥不可导出,服务端保存公钥验签 |
| 用户登录令牌保护 | AES/CBC/PKCS7Padding | 对称密钥 | 绑定用户认证,锁屏变更后失效 |
| 设备身份认证 | ECDSA + Key Attestation | 非对称密钥对 | 使用密钥证明向服务端证明设备可信 |
本课程后续将沿着上述学习路径逐步展开:先理解密钥库的架构与安全边界,再掌握核心 API 的参数含义,随后进入支付、加密、认证等真实场景,最后通过密钥证明、认证绑定和误用复盘完成安全进阶。掌握这条主线,你就能在 Android 应用中构建出真正可靠的密钥服务体系。