You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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:

  1. 基础屏障是应用签名+UID,其他应用根本没权限碰你的密钥;
  2. 你可以通过KeyGenParameterSpec给密钥加自定义限制,比如用户认证、操作类型限制;
  3. 只要按官方规范来,不用怕权限泄露的问题。

内容的提问来源于stack exchange,提问作者Roper

火山引擎 最新活动