Keystore(Android):它是什么、架构及工作原理

作者: IT Sectr 发布日期: 2026-03-14 阅读时间: 10 分钟

Android Keystore — 是Android的系统机制,用于在硬件隔离中安全存储加密密钥。该系统在具有ARM TrustZone的设备上使用Trusted Execution Environment(TEE)或专用的Secure Element来在芯片层面保护密钥。据Android Open Source Project,Keystore支持RSA、EC、AES和HMAC算法,并在安全环境中直接生成密钥。

主要

  • Android Keystore — KeyStore提供商,将加密密钥与Android用户空间隔离
  • 密钥 在TEE或Secure Element内部生成,从不以明文形式离开安全环境
  • Android 9+ 添加KeyGenParameterSpec.Builder,包含参数:purpose、digest、padding、userAuthenticationRequired
  • 生物识别 密钥保护要求在每次操作前通过BiometricPrompt确认用户
  • Keymaster HAL — 硬件抽象层,在TEE或Secure Element中执行加密操作

什么是Android Keystore?

Android Keystore — 是Android中从BAPI 1(Android 1.0)开始实现的加密提供商(provider),但完整的硬件支持介Android 4.3(API 18)开始。Keystore解决了安全存储私钥的问题,使得即使操作系统被攻击,攻击者也无法以明文形式提取密钥。

Android上的KeyStore架构

Android Keystore的架构由三个层级组成:应用程序API(java.security.KeyStore)、系统服务(keystore daemon)和硬件层(Keymaster HAL)。应用程序通过标准Java Cryptography Architecture(JCA)API访问,系统服务将请求路由到在TEE中运行的Keymaster。

所有与密钥相关的加密操作(签名、解密)均在TEE或Secure Element内部执行。密钥从不离开安全环境——应用程序只获取一个别名(alias)来引用密钥。这是与软件KeyStore的根本区别,在软件KeyStore中密钥可能在进程内存中被访问。

与Java KeyStore的区别

标准的JKS(Java KeyStore)或BKS(Bouncy Castle)将密钥存储在口令保护的文件中。Android Keystore将密钥存储在硬件隔离中,即使root用户也无法访问。JKS在直接访问文件系统时存在漏洞,而Android Keystore没有这个问题。

另一个区别:在Android Keystore中,密钥具有严格的使用参数(purpose——仅限sign/verify/encrypt/decrypt),在生成时设置。这些参数后续无法修改,从而避免密钥被滥用。

Android Keystore如何工作?

创建新密钥时,应用程序调用含有未来密钥所有参数的KeyGenParameterSpec的KeyPairGeneratorKeyGenerator。系统将请求转发给Keymaster HAL,其在TEE内部生成密钥并返回别名。

密钥生成过程

KeyGenParameterSpec.Builder方法接受必填参数:Keystore中的密钥名称、目的(PURPOSE_SIGN、PURPOSE_ENCRYPT)、算法(RSA、EC、AES)。额外参数:digest(SHA-256)、padding(PKCS7)、userAuthenticationRequired(生物识别)、keyValidityStart/End(时间限制)。

设置参数后,KeyPairGenerator.generateKeyPair()返回KeyPair,其中PrivateKey是将操作委托给Keymaster的对象。公钥可以提取,私钥则不能。它仅存在于TEE内部。

kotlin
import java.security.KeyPairGenerator
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties

fun generateKey(alias: String) {
    val spec = KeyGenParameterSpec.Builder(alias,
        KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
    ).setDigests(KeyProperties.DIGEST_SHA256)
     .setSignaturePaddings(KeyProperties.SIGN_PADDING_RSA_PKCS1)
     .setUserAuthenticationRequired(true)
     .build()

    val kpGen = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_RSA,
        "AndroidKeyStore"
    )
    kpGen.initialize(spec)
    kpGen.generateKeyPair()
}

签名与验证

针对ECDSA或RSA-PSS的Signature通过标准API创建:Signature.getInstance(algorithm).initSign(privateKey)。签名操作在TEE中执行:应用程序发送数据,Keymaster通过硬件签名并返回签名。密钥和数据在共享内存中不会混合。

对于生物识别保护,需要在签名前通过BiometricPrompt验证用户。如果验证失败,Keymaster将不执行操作,并返囎CryptoAuthenticationException。

kotlin
import java.security.KeyStore
import java.security.Signature
import androidx.biometric.BiometricPrompt

fun signWithBiometric(alias: String) {
    val ks = KeyStore.getInstance("AndroidKeyStore")
    ks.load(null)
    val entry = ks.getEntry(alias, null) as KeyStore.PrivateKeyEntry
    val signature = Signature.getInstance("SHA256withRSA")
    signature.initSign(entry.privateKey)
    // BiometricPrompt使用CryptoObject(signature)请求FaceID/PIN
}

KeyStore存储类型

Android支持两种密钥存储模式:软件(在没有TEE的设备上)和硬件(在具有TEE或Secure Element的设备上)。模式取决于SoC的能力和Android版本。

软件KeyStore(仅软件)

在没有Trusted Execution Environment的设备上(Android 4.3之前或低端SoC),密钥以加密形式存储,使用从锁屏密码导出的主密钥。这种模式安全性较低——在加密操作期间,密钥在进程内存中可被访问。

保护等级基于使用AES-256-GCM加密KeyStore文件。加密密钥通过Scrypt(大量迭代的PBKDF2)根据用户密码或PIN生成。

硬件KeyMaster(TEE/Secure Element)

在现代设备上,TEE(ARM TrustZone)中使用Keymaster 4.x。密钥仅在TrustZone内部生成、存储和使用。即使Linux内核也无法访问私钥——只有Keymaster HAL可以执行操作。

Secure Element(例如Samsung Knox中的eSE或Google Pixel 3+中的StrongBox)——是一个拥有自己处理器和内存的独立芯片。它获得了Common Criteria EAL 4+认证,提供最高级别的保护,包括防御物理拆解。

类型存储位置保护等级从BAPI可用
Software文件 /data/misc/keystore中等(AES-256)API 1+
Keymaster 3TEE(TrustZone)API 23+
Keymaster 4TEE + Secure I/O很高API 28+
StrongBox硬件Secure Element最高API 28+,可选

使用KeyStore API

Android Keystore集成到Java Cryptography Architecture(JCA)中。要访问提供商,使用标准的KeyStore.getInstance("AndroidKeyStore")。该API从BAPI 18开始可用。

创建和加载KeyStore

KeyStore.load(null)方法加载当前应用程序的KeyStore容器。不需要密码——Android使用应用程序上下文和其UID来区分访问权限。除非使用共享UID,否则每个应用程序只能看到自己的记录。

setEntrygetEntry方法与KeyStore.PrivateKeyEntry、SecretKeyEntry或TrustedCertificateEntry工作。对于Android Keystore,ProtectionParameter参数始终为null(保护在系统层实现)。

kotlin
import java.security.KeyStore
import java.security.cert.Certificate
import android.security.keystore.KeyProtection

fun storeSecretKey(alias: String, key: SecretKey) {
    val ks = KeyStore.getInstance("AndroidKeyStore")
    ks.load(null)
    val prot = KeyProtection.Builder(
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
    ).setBlockModes(KeyProperties.BLOCK_MODE_GCM)
     .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
     .setUserAuthenticationRequired(true)
     .build()
    ks.setEntry(alias, KeyStore.SecretKeyEntry(key), prot)
}

检查存储类型

通过KeyCharacteristics可以确定密钥存储在什么环境中:软件KeyStore、TEE或StrongBox。getKeyCharacteristics()方法返回一组标志:FLAG_HARDWARE(keymaster)、FLAG_SECURE_ELEMENT(StrongBox)、FLAG_TRUSTED_USER_PRESENCE_REQUIRED(生物识别)。

算法与安全

Android Keystore支持广泛的加密算法集,分为三类:非对称、对称和MAC。特定算法的支持取决于Keymaster HAL版本。

支持的算法

RSA(1024–4096位)——用于签名(PKCS1、PSS)和加密(OAEP、PKCS1)。EC(P-224、P-256、P-384、P-521)——用于ECDSA签名和ECDH协商。AES(128、256位)——用于CBC、CTR、GCM模式下的对称加密。HMAC(SHA1、SHA256、SHA512)——用于消息验证。

对于每个密钥,设置setPurposes来限制可能的操作。具有PURPOSE_SIGN的RSA密钥不能用于加密,即使攻击者能访问API。这是硬件层面上对密钥用途的强制限制。

防御攻击

Keymaster包含生物识别验证失败次数记数器。在达到指定的失败次数后(可通过setInvalidatedByBiometricEnrollment配置),密钥将变得不可用,需要删除/重新生成。删除所有生物识别模板后,所有带有userAuthenticationRequired=true的密钥将自动失效。

还支持Key Attestation(Android 8.1+):应用程序请求时,Keymaster签署一份包含密钥特征(硬件/软件、算法、purges)信息的证书。服务器可以验证这份证书,以确认密钥是在可信环境中创建的。

常见问题

Android Keystore和Java中的KeyStore有什么区别?

Java KeyStore将密钥存储在口令保护的文件中(JKS、BKS)。Android Keystore使用TEE或Secure Element的硬件隔离。Java KeyStore在root访问时存在漏洞,而Android Keystore没有,因为私钥从不离开安全环境。

可以将现有密钥导入Android Keystore吗?

可以,通过KeyStore.setEntry使用KeyProtection。但导入的密钥将不具有硬件保护——它将存储在软件Keystore中,由主密钥加密。为了最大程度的安全,始终在Keystore内部生成密钥。

如何检查设备是否支持硬件KeyStore?

使用KeyChain.isBoundKeyAlgorithm或在生成密钥后检查KeyCharacteristics。特征中的FLAG_HARDWARE表示密钥是在TEE中创建的。您也可以检查android.security.keystore.isHardwareBacked()。

删除应用程序时密钥会怎样?

删除应用程序时,Android会从Keystore中删除其所有密钥。数据将不可逆地丢失。重新安装时,应用程序必须生成新密钥。由于架构原因,无法通过TEE备份密钥。

KeyStore如何防御通过调试发起的攻击?

在锁定的设备上,Keymaster不执行任何操作。带有userAuthenticationRequired=true的密钥每次都需要生物识别确认。即使拥有root访问权,攻击者也无法直接调用Keymaster——只能通过Android Keystore服务。

总结

  • Android Keystore — JCA加密提供商,通过TEE或Secure Element实现密钥的硬件隔离
  • 密钥 在TrustZone内部生成,从不以明文形式离开安全环境
  • KeyGenParameterSpec 设置密钥参数:purpose、digest、padding、userAuthenticationRequired、keyValidity
  • Keymaster HAL 实现三个层级:软件(software)、TEE(Keymaster 3/4)和StrongBox(硬件Secure Element)
  • 生物识别 密钥保护由setUserAuthenticationRequired和带有CryptoObject的BiometricPrompt提供
  • Key Attestation(API 28+)允许在服务器端验证密钥是在硬件环境中创建的
  • 使用Android Keystore在Android应用程序中存储私钥,用于签名、加密和验证

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读