当密钥不再可访问时,解密使用SecretKey加密的字符串

时间:2015-05-30 16:15:55

标签: android encryption

我在这里有一个有趣的情况。我的应用程序存储用户输入的敏感信息,例如他们的社交服务帐户。我使用用户输入的主密码生成SecretKey,然后使用AES加密并将其SHA1哈希和加密数据存储在设备上,但不存储主密码本身或密钥。

问题是,如果用户忘记了密码,他们可以回答一个秘密问题并更改主密码。因此,当主通行证被更改时,由于先前的密码(以及相关的SecretKey)永远消失,我无法解密存储的字符串并向用户显示解密的数据。

以下是我能想到的解决方案:

1 - 存储密码,我听说完全不安全。

2 - 存储SecretKey,但我听说这也不安全。

3 - 将用户数据存储在未加密的数据库中,我猜这是不安全的。

4 - 每次用户忘记密码时擦除整个数据库,我认为这很愚蠢。

我需要一种方法来克服这个问题,而我却无法想出一种安全的方法来解决这个问题。 至关重要的是,这可以解决我的应用程序飞行。任何和所有帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

  

因为忘记密码而删除所有用户数据有点不公平。

然后他们不应该将东西存放在需要密码的容器中。接下来,你会争辩说任何人都应该能够使用曲棍球票根和一些口香糖打开任何墙壁安全,因为有人可能会忘记锁的组合。

请注意,您的查询内容假定您的开头段落中描述的方法是构建具有您所需安全特性的应用的正确方法。

例如,满足您要求的正确答案是根本不加密数据,而是强迫用户对其设备进行全盘加密。您可以使用DevicePolicyManager查看设备是否启用了全盘加密,如果不启用,则可以拒绝运行。然后,数据被加密,就像其他设备一样,但您不再需要处理密码短语和恢复方案 - 这取决于Google和设备制造商。

  

没有其他方法可以解密数据吗?

仅当您的应用中存在漏洞时(例如,后门)。这是票根和口香糖的场景。加密数据背后的重点是使它在没有密码或等效安全密钥的情况下无法加密。

因此,您的应用的另一种方法是转储所有关键内容并使用KeyStore。特别是在具有硬件支持KeyStore的设备上,没有办法真正获得密钥,没有解锁设备。在这里,您不必担心全盘加密(因为您正在加密数据),您也不必担心用户忘记密钥(因为用户从未拥有密钥)。它还可以让您不必让用户输入密码。但是现在你不能轻易备份数据(因为没有密钥就没用),如果用户的设备被面包车卡车运行或者被破坏,数据就会消失。您可以为用户提供备份密钥的选项(例如,备份到可移动媒体),但现在您依赖它们记住它们存储备份的位置,安全地存储备份密钥等等。

  

或者像以前一样制作相同的SecretKey?

因为除了你之外没有人知道你是如何创造这个的,除了你以外,没有人可以回答你的问题。

我还建议你阅读this paper,因为它概述了他们调查的88%Android应用程序,他们试图拼凑自己的加密方法,搞砸了它。