ChromeOS上Android应用能否创建SECURITY_LEVEL_TRUSTED_ENVIRONMENT及以上密钥对?
Chromebook上Android应用生成硬件背书安全密钥的可行性说明
核心结论
在ChromeOS版本≥89、设备本身搭载合规TPM2.0/内置安全芯片(如Titan C)的前提下,运行在Android兼容层的应用可以正常生成达到SECURITY_LEVEL_TRUSTED_ENVIRONMENT级别的硬件背书密钥对,密钥实际存储在Chromebook内置安全芯片中,不会回退到软件实现。
ChromeOS的Android运行环境并非完全隔离的通用虚拟机,谷歌官方针对硬件安全能力做了直通适配:宿主系统的安全芯片能力会直接映射给Android层的Keystore服务,虚拟化层不会拦截这类硬件安全调用,你不需要做任何ChromeOS侧的特殊适配,代码逻辑和原生Android设备完全一致。
实现与校验要点
- 初始化
KeyPairGenerator时必须绑定AndroidKeyStore提供者,不要使用其他默认提供者,否则会默认走软件实现:
// 初始化密钥生成器,绑定Android系统Keystore KeyPairGenerator kpg = KeyPairGenerator.getInstance( KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore" ); kpg.initialize(new KeyGenParameterSpec.Builder( "your_key_alias", KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY ) .setDigests(KeyProperties.DIGEST_SHA256) // 注意:不要开启setIsStrongBoxBacked,绝大多数Chromebook无独立StrongBox安全元件,开启会直接抛异常 .setIsStrongBoxBacked(false) // 可根据业务需求调整是否需要用户认证 .setUserAuthenticationRequired(false) .build() ); KeyPair keyPair = kpg.generateKeyPair();
- 生成密钥后必须主动校验安全级别,不要默认假设所有设备都满足硬件背书要求:
KeyFactory kf = KeyFactory.getInstance(keyPair.getPrivate().getAlgorithm(), "AndroidKeyStore"); KeyInfo keyInfo = kf.getKeySpec(keyPair.getPrivate(), KeyInfo.class); // 当返回值≥SECURITY_LEVEL_TRUSTED_ENVIRONMENT时,即为硬件背书密钥 boolean isTrustedEnvBacked = keyInfo.getSecurityLevel() >= KeyProperties.SECURITY_LEVEL_TRUSTED_ENVIRONMENT;
- 无法生成符合要求密钥的常见场景:
- ChromeOS版本低于M89:该版本前Android兼容层未做TPM直通,所有密钥均为软件实现,安全级别最高为
SECURITY_LEVEL_SOFTWARE - 设备本身未搭载TPM2.0及以上规格的安全芯片:老旧Chromebook无硬件安全环境,自然无法生成对应级别的密钥
- 错误开启
setIsStrongBoxBacked(true)参数:Chromebook内置安全芯片满足可信环境要求,但达不到StrongBox(独立安全元件)的安全等级,开启该参数会直接生成失败。
- ChromeOS版本低于M89:该版本前Android兼容层未做TPM直通,所有密钥均为软件实现,安全级别最高为
内容的提问来源于stack exchange,提问作者Khongor Bayarsaikhan
相关产品推荐
相关产品推荐

