应用程序卸载时,KeyStore条目是否会丢失?

16

我在Android密钥存储中生成了一对非对称密钥,如下所示:使用公钥进行对称密钥包装并将封装的密钥存储到文件中。当我尝试使用私钥解开对称密钥时,在该实例内我可以成功解开。但是一旦重新安装我的应用程序,则无法使用别名获取密钥存储条目。

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
    KeyProperties.KEY_ALGORITHM_RSA,
    "AndroidKeyStore"
);

kpg.initialize(new KeyGenParameterSpec.Builder(
        Constants.KEY_STORE_ALIAS_NAME,
        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT
    )
    .setKeySize(Constants.ASYMMETRIC_KEY_LENGTH)
    .setBlockModes(KeyProperties.BLOCK_MODE_ECB)
    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
    .build()
);

keyPair =  kpg.generateKeyPair();

// Code for accessing the key store entry to un wrap the symmetric key
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(Constants.KEY_STORE_ALIAS_NAME, null);
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
1个回答

8
Android Keystore中存储的密钥是不可提取的。这是一项安全措施。

安全特性

Android Keystore系统保护密钥材料免受未经授权的使用。首先,Android Keystore通过防止从应用程序进程和整个Android设备中提取密钥材料来减轻密钥材料在Android设备之外的未经授权的使用。其次,Android KeyStore通过使应用程序指定其密钥的授权使用,并在应用程序进程之外强制执行这些限制来减轻在Android设备上未经授权的密钥材料的使用。

这意味着密钥不能以任何方式成为Android备份服务的一部分。一旦应用程序被卸载,它允许将应用程序数据存储在云上。请参见HowBackupWorks
如果私钥可以被提取并存储在云中甚至在应用程序被卸载后仍然存储在设备中,那将是一个严重的安全风险。
如果需要使用不依赖于重新安装的加密密钥,则可以使用密钥派生算法从用户口令生成对称密钥。

谢谢...即使使用基于口令短语的加密,我们也必须唯一地维护口令短语。否则,一旦用户更改了口令短语,加密的文件将无法解密。我考虑生成非对称密钥对,并将其用于解密对称密钥的包装/拆包。我的目标是应用程序应该能够在卸载之前解密所有已加密的文件。 - Hithendra Nath
要求用户输入口令,因此用户必须记住它。另一种选择是在与用户帐户相关的服务器端上制作加密密钥的备份副本,并在重新安装后下载它,但这种解决方案存在安全风险。尽量确保用户密钥永远不离开设备。 - pedrofb
1
好的..一般来说,私钥是如何维护的呢?它存储在哪里?因为我可以在Android应用程序之外生成密钥对,以便我可以使用相同的RSA密钥对。在这种情况下,如何安全地保留私钥?理想情况下,密钥对应该只生成一次并被重复使用。因此,从应用程序中生成它将不是正确的方法。密钥应该在应用程序之外生成并提供给应用程序。这个理解正确吗? - Hithendra Nath
1
一个使用案例(可能还有其他):密钥对由Android应用程序使用标准的KeyPairGenerator(而不是AndroidKeyStore)生成,并使用密码磁盘保护。您可以使用pkcs#12文件(.p12)或将私钥加密到PEM文件中(请参见此处)。在重新安装时,提示用户输入密码并解密密钥。然后,您可以将其导入到AndroidKeyStore中,或每次启动应用程序时解密密钥。 - pedrofb
好的,当您有足够的声望时,请考虑通过单击复选标记或点赞来接受答案。 - pedrofb
我实际上并不清楚私钥是如何加密的。我仍然需要尝试如何解密它。但是,我确实在寻找这个。谢谢。 - Hithendra Nath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接