You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制同一应用内特定进程的Keystore访问权限?

同一应用内不同进程的Keystore访问权限限制方案

可以实现同一应用内不同进程的Keystore密钥隔离,核心思路是通过进程专属的密钥别名命名策略,让每个进程只能访问自己创建的密钥条目,具体方案如下:

核心实现思路

Android Keystore默认基于应用UID做权限控制,同属一个应用的所有进程共享同一个UID,因此默认情况下所有进程都能访问应用内的Keystore密钥。但我们可以通过为每个进程生成唯一的密钥别名,让其他进程无法知晓目标密钥的别名,从而实现访问隔离。

具体实现步骤

1. 为每个进程生成唯一标识

优先使用进程名作为唯一标识(在AndroidManifest.xml中为不同进程配置的android:process属性值是固定的),比进程ID更可靠(进程ID会随进程重启变化)。

获取进程名的代码示例:

private String getProcessName() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        return Application.getProcessName();
    }
    // 兼容Android P以下版本
    try {
        BufferedReader reader = new BufferedReader(new FileReader("/proc/" + android.os.Process.myPid() + "/cmdline"));
        String processName = reader.readLine().trim();
        reader.close();
        return processName;
    } catch (IOException e) {
        e.printStackTrace();
        return String.valueOf(android.os.Process.myPid());
    }
}

2. 创建进程专属的密钥条目

在创建密钥时,将进程名拼接进密钥别名,确保每个进程的密钥别名唯一。其他进程不知道这个别名,自然无法访问该密钥。

创建RSA密钥对的代码示例:

try {
    KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
    keyStore.load(null);

    String uniqueKeyAlias = "app_secure_key_" + getProcessName();
    if (!keyStore.containsAlias(uniqueKeyAlias)) {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
        keyGen.initialize(new KeyGenParameterSpec.Builder(
                uniqueKeyAlias,
                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                .build());
        keyGen.generateKeyPair();
    }

    // 仅当前进程能通过该别名获取密钥
    KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(uniqueKeyAlias, null);
    // 后续使用密钥进行加密/解密操作
} catch (Exception e) {
    e.printStackTrace();
}

3. 额外的安全强化(可选)

如果需要更严格的隔离,可以结合以下手段:

  • 为密钥添加用户验证要求(如setUserAuthenticationRequired(true)),确保只有验证过的用户才能使用密钥,进一步降低跨进程访问的风险;
  • 避免将密钥别名明文存储在公共存储区(如SharedPreferences),如果需要持久化别名,可使用加密存储。

注意事项

  • 进程名的稳定性:确保在AndroidManifest.xml中为不同进程配置的android:process值固定,避免随意修改导致密钥无法访问;
  • 密钥的生命周期:如果进程被销毁,对应的密钥不会自动删除,若不再需要,需手动调用keyStore.deleteEntry(uniqueKeyAlias)清理;
  • 兼容性:该方案支持API 18及以上所有版本,无需依赖高版本Android特性。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:30:11