如何限制同一应用内特定进程的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
相关产品推荐
相关产品推荐

