Android KeyStore安全存储疑问:用户未认证提示及解锁权限解析
Android KeyStore 访问权限全解析(适配6.0+)
嘿,刚好对Android KeyStore这块熟,来给你掰扯清楚谁能解锁/访问你存在这儿的密钥!毕竟要对标iOS KeyChain的安全级别,权限这块确实得搞明白。
核心访问规则:绑定应用身份
Android KeyStore的安全基础是强绑定应用的签名和进程UID:
- 只有和生成密钥的应用签名完全一致、且拥有相同UID的进程,才能访问这个密钥。说白了,其他应用哪怕猜到你的
keyAlias,也根本碰不到——KeyStore会直接验证调用者的身份,不同签名/UID的请求会被秒拒。 - 如果你的应用是多进程架构,同一个应用的不同进程(UID相同)默认也能访问密钥,除非你特意在生成密钥时限制了进程(一般没必要这么做)。
你可以自定义额外的访问限制
除了基础的身份验证,你在生成密钥时用的KeyGenParameterSpec还能加更严格的访问条件,比如:
setUserAuthenticationRequired(true):要求用户必须通过设备认证(指纹、PIN、图案)才能使用密钥——哪怕是你自己的应用,也得先过用户这一关,防止设备被盗后恶意使用。setUserAuthenticationValidityDurationSeconds(int):设置用户认证后的有效时长,比如设300秒,那5分钟后再用密钥就得重新让用户验证。如果设成-1,表示只要设备处于解锁状态就能用。setAllowedPurposes(...):限制密钥只能用于特定操作,比如只允许加密/解密,那就算拿到密钥也没法用来做签名操作,缩小风险范围。
给你补一段标准的密钥生成代码(带权限配置)
结合你提到的generateKey方法,给你贴一段适配6.0+的规范代码,方便你对照调整权限:
private SecretKey generateKey(String keyAlias) throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance( KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder( keyAlias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_GCM) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) // 可选:开启用户认证,进一步提升安全性 // .setUserAuthenticationRequired(true) // 可选:设置认证有效时长,-1表示设备解锁期间都有效 .setUserAuthenticationValidityDurationSeconds(-1) .build(); keyGenerator.init(spec); return keyGenerator.generateKey(); }
一句话总结
KeyStore的安全级别完全能对标KeyChain:
- 基础屏障是应用签名+UID,其他应用根本没权限碰你的密钥;
- 你可以通过
KeyGenParameterSpec给密钥加自定义限制,比如用户认证、操作类型限制; - 只要按官方规范来,不用怕权限泄露的问题。
内容的提问来源于stack exchange,提问作者Roper




