可恢复密码的推荐加密方式


Recommended encryption method for recoverable passwords

我有一个应用程序,需要保持多个用户密码,要求他们是可恢复的。

我正在考虑使用主密码+另一种加密机制来加密密码。

用于加密的密钥将保存在外部系统中,并且可以使用API检索。问题是我不确定是否:
  1. 此方法足够安全
  2. 我应该选择哪种额外的加密机制

谢谢。

编辑 --------------我知道关门了……但我确实想澄清——我必须有解密的能力,这是我的应用程序的主要部分……说了这么多,我想我得到了AES算法的答案。我不需要哈希,因为哈希是不可逆的

Stack overflow是一个帮助你解决编码问题的论坛。

这个问题更适合在安全论坛讨论。

也就是说,有一些标准化的加密准则。

实现对称加密密码时,最好使用AES算法。这是迄今为止最安全的对称密钥分组密码,也是我们目前认为"受保护"的标准。

如果您正在寻找散列密码,这是密码存储的标准,那么不需要密钥。使用SHA1算法。就输出的大小而言,它是目前使用的更安全的散列算法。其他选项为SHA256和SHA512

Edit:哦,时代在变化。哈希算法也是如此!人们正在从SHA散列算法家族转向Bcrypt, Bcrypt还有其他几个特性,比如引入成本因素来防止彩虹表。

我不确定是否…这个方法足够安全

不,它不是。大多数人认为,任何允许恢复密码而不是安全重置密码的密码存储方法都不"安全"。此外,用户是如何发送他们的"恢复"密码的?因为使用电子邮件是最糟糕的方法。

如果你无法绕过必须能够"恢复"密码,那么你想要的是非对称[又名公钥]加密。密码将由公钥加密并存储在数据库中以供比较。私钥应该分开保存,最好是离线保存在安全的记忆棒上,并且至少有一个密码保护,如果不是由不同的人持有的两个或更多密码。

正如其他人提到的,这个问题更适合http://security.stackexchange.com而不是这里,但它已经被问过很多次了,你会得到更多关于不要这样做的强烈鼓励,而不是解决方案。

这是你的必读:你可能存储了错误的密码

现在,关于如何存储加密密码的问题。不喜欢。存储散列密码。


你可能找错了问题。我怀疑你想创建一个功能来恢复密码…这样的话,如果你不介意的话,我就把你送到我以前的答案中去。


作为另一种选择,您可能希望在客户机上为单个用户存储多个密钥。如果这是您想要的,那么您最好的选择是使用操作系统提供的安全性来保护它。您不应该期望为操作系统提供的用户提供比加密文件更好的文件。


否则,你基本上设计了一种方法,所有存储的密码都将被窃取。要么是因为现在被认为安全的东西明天可能不再被认为是安全的,要么是因为我们是人类(对吧?),我们会犯错误。

无论如何,您的安全性最多与辅助API的身份验证过程一样强(我的意思是,检索密钥以破译密码的过程)。您确实提到了Java,您的Java代码被反向工程发现如何获得密码的可能性有多大?

PHP支持SHA1, manual: http://php.net/manual/en/function.sha1.php

if (sha1($str) === 'd0be2dc421be4fcd0172e5afceea3970e2f3d940') {"你喜欢绿苹果还是红苹果?"}

和JAVA SHA1示例:http://www.herongyang.com/Cryptography/SHA1-Message-Digest-in-Java.html

您可以将SALT + PSK(SHA1)与AES加密结合使用。

我建议使用SYSTEM SALT(在系统上生成SHA512密钥+在用户上生成SALT + PSK SHA512登录)。

或者最好使用PBKDF2,如果你不能使用bcrypt或scrypt与SHA2。