我有一个应用程序,可以生成一个用于加密/解密的密钥,而且它运行得很好。我将密钥存储在KeyStore和IV中,作为第一个12B存储在外部存储中的加密文件中。当我想解密该文件时,我从外部存储(因此我得到IV)和从KeyStore获得密钥,并且我能够获得原始内容。我的第二个应用程序App2可以访问外部存储中的文件(因此它可以获得IV),但是它不能从App1 KeyStore获得密钥。我读到了关于KeyChain的文章,它在官方文档中说它不是app私有的(当你想要系统范围的凭证时使用KeyChain API )。我是否可以以某种方式将我的密钥存储在这个KeyChain或其他地方,这样我的App2就可以得到它(得到用户的批准或类似的东西)。下面是我用来在App1中创建和存储密钥的代码。
private static SecretKey createAndStoreKey() {
KeyGenerator keyGen;
try {
// Generate 256-bit key
keyGen = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, KEY_STORE_NAME);
final KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(KEY_ALIAS,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.build();
keyGen.init(keyGenParameterSpec);
SecretKey secretKey = keyGen.generateKey();
if(secretKey != null)
return secretKey;
else
return null;
}
catch (NoSuchProviderException e){
e.printStackTrace();
return null;
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
catch (InvalidAlgorithmParameterException e){
e.printStackTrace();
return null;
}
}谢谢大家的帮助。
发布于 2019-05-14 12:06:12
当您需要系统范围的凭据时,请使用KeyChain API。当应用程序通过KeyChain API请求使用任何凭据时,用户可以通过系统提供的UI选择应用程序可以访问的已安装凭据中的哪一个。这允许多个应用程序在用户同意的情况下使用相同的凭证集。 使用Android提供商可以让单个应用程序存储自己的凭据,只有应用程序才能访问这些凭据。这为应用程序提供了一种管理凭据的方法,这些凭据只能单独使用,同时提供了与KeyChain API为系统范围内的凭据提供的相同的安全好处。此方法不需要用户交互来选择凭据。参照系
https://stackoverflow.com/questions/48808184
复制相似问题