2. 环境搭建与SDK配置:minSdkVersion要求、依赖库引入、模拟器与真机差异

搭建 Android Keystore 加密开发环境时,minSdkVersion 直接决定了可用的 KeyStore 特性与 API 级别。自 API 18(Android 4.3)起系统内置 KeyStore,而更高级的 KeyGenParameterSpec(支持 AES-GCM / ECDSA / 安全密钥导出)要求 API 23+。同时,依赖库的选择会影响 TLS、证书验证等功能的兼容性。

2.1 minSdkVersion 要求

功能 / 特性最低 SDK说明
基本 KeyStore 访问API 18KeyStore.getInstance("AndroidKeyStore") 可用
KeyGenParameterSpecAPI 23支持 AES-GCM、EC、RSA 等强算法参数配置
生物识别绑定密钥API 28setUserAuthenticationParameters() 精细化控制
StrongBox 安全硬件API 28KeyGenParameterSpec.Builder.setIsStrongBoxBacked(true)
⚠️ 警告:若 minSdkVersion ≤ 22,请使用 KeyStore.PrivateKeyEntry 配合 KeyPairGeneratorSpec(已废弃),或通过 Compatibility 库垫片处理。切勿在低版本上尝试 KeyGenParameterSpec,否则将引发 IllegalArgumentException。

2.2 依赖库引入

在 build.gradle(模块级别)中使用以下核心依赖:

// app/build.gradle
android {
    compileSdk 34
    defaultConfig {
        minSdk 23          // 至少 23 以使用 KeyGenParameterSpec
        targetSdk 34
    }
}

dependencies {
    // AndroidX Security Crypto(推荐,提供 EncryptedSharedPreferences 等便捷封装)
    implementation "androidx.security:security-crypto:1.1.0-alpha06"

    // 若需要 TrustManager / TLS 手动验证,可引入 Conscrypt
    implementation "org.conscrypt:conscrypt-android:2.5.2"

    // 用于 RSA/EC 操作的标准库(已随 Android SDK 包含)
    // 无需额外引入
}
💡 提示:使用 security-crypto 可自动处理密钥创建、GCM 加密等核心流程,但仍建议理解底层 KeyStore 机制。生产环境建议锁定版本号,避免 alpha 阶段意外变更。

2.3 模拟器与真机差异

开发阶段务必区分模拟器与真机行为:

  • 模拟器(x86 / ARM):KeyStore 由软件模拟实现,不具备硬件隔离(如 TEE / StrongBox)。密钥材料驻留在用户空间,存在被 Root 或快照提取的风险。
  • 真机(非 Root):大多数设备支持基于 TEE(TrustZone)或专属安全协处理器的硬件 KeyStore,密钥无法从 Android 上下文中导出。
  • StrongBox:仅部分高端设备(Pixel 4+、三星 S10+ 等)具有独立安全芯片,API 28 以上可检测。
维度模拟器真机
KeyStore 实现纯软件硬件 TEE / StrongBox
密钥非导出性仅逻辑保证,可能被 dump物理级别保护
性能较快(无硬件加解密开销)依赖硬件加速,速度与功耗优秀
调试便利性可查看日志、快照、复制数据需 adb / 抓日志,密钥不可见
推荐用途逻辑开发、API 调用验证安全测试、生产前最终验证
🔍 调试建议:在模拟器上完成基本加解密流程后,务必在物理设备上验证 KeyStore.getKey() 时的 UserNotAuthenticatedException、生物识别超时等安全场景。同时使用 adb shell dumpsys security.keystore 检查密钥存储状态(仅 debug 可读)。
环境搭建决策流程 确定 minSdkVersion ≥23? KeyGenParameterSpec 添加 security-crypto 旧 KeyPairGeneratorSpec 手动兼容 / 垫片 模拟器 → 真机验证 最终部署前必须移除模拟器测试数据,确保密钥在硬件环境中创建

2.4 常见错误与稳定性优化

  • 错误:minSdk < 23 却调用 KeyGenParameterSpec.Builder → 改用 KeyPairGeneratorSpec 或升级 minSdk。
  • 错误:在模拟器测试通过后,真机出现 KeyStoreException: KeyStore not initialized → 检查是否在 UI 线程调用 KeyStore.load(null)(必须异步)。
  • 稳定性:使用 security-crypto 库时,确保 MasterKey.Builder 每次声明相同的算法参数,否则解密已加密数据会失败。
  • 性能优化:硬件 KeyStore 操作(如 RSA 签名)在低端设备上可能耗时 200ms+,建议在 Dispatchers.IO 协程或 AsyncTask 中执行。
⚙️ 配置检查清单:
  1. 确认 build.gradle 中 minSdk >= 23(若需 KeyGenParameterSpec)。
  2. 引入 androidx.security:security-crypto 并同步项目。
  3. 打开模拟器,创建一条 AES-GCM 密钥并进行加解密测试。
  4. 连接真机,运行相同测试,观察 dumpsys security.keystore 输出是否含 hardware-backed: yes。
  5. 检查 KeyInfo 的 isInsideSecurityHardware() 方法返回值是否符合预期。