【问题标题】:Are KeyStore entries lost when the application is uninstalled?卸载应用程序时 KeyStore 条目是否丢失?
【发布时间】:2018-06-27 13:40:22
【问题描述】:

我正在 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();

【问题讨论】:

    标签: android cryptography encryption-asymmetric


    【解决方案1】:

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

    安全功能

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

    这意味着密钥不能以任何方式成为 Android 备份服务的一部分。它允许在卸载应用程序后将应用程序数据存储在云上。见HowBackupWorks

    如果私钥被提取并存储在云中,甚至在卸载应用程序后仍然存储在设备中,这将是一个严重的安全风险

    如果您需要使用不依赖于重新安装的加密密钥,您可以使用密钥派生算法从用户密码生成对称密钥

    【讨论】:

    • 谢谢...即使使用基于密码短语的加密,我们也必须保持密码短语的唯一性。否则,一旦用户更改密码,被加密的文件根本无法解密。我想过一次生成非对称密钥对,然后用它来解密对称密钥的包装/解包。我的目标是应用程序应该能够解密所有在卸载之前加密的文件。
    • 向用户请求密码,因此用户必须记住它。替代方法是在与用户帐户关联的服务器端以某种方式制作加密密钥的备份副本,然后下载它重新安装后,但此解决方案存在安全风险。尝试让用户密钥永远不会离开设备
    • 好的 .. 一般而言,私人如何维护呢?它存储在哪里?因为,我可以在 android 应用程序之外生成密钥对,这样我就可以使用相同的 RSA 密钥对。在这种情况下如何安全地保存私钥?理想情况下,密钥对应该生成一次并使用。因此,从应用程序生成它不是正确的方法。密钥应在应用程序外部生成并提供给应用程序。这种理解正确吗?
    • 一个用例(可能还有其他用例):密钥对由 android 应用程序使用标准 KeyPairGenerator(不是 AndroidKeyStore)生成并存储在受密码保护的磁盘上。您可以使用 pkcs#12 文件 (.p12) 或将私有文件加密到 PEM 文件中(请参阅this)。重新安装时,提示用户输入密码并解密密钥。然后你可以将它导入AndroidKeyStore或每次应用启动时解密密钥
    • 好的,考虑通过单击复选标记来接受答案,或者当您有足够的声望时点赞。
    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 2013-09-10
    • 2018-08-22
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多