我有一个应用程序,需要保持多个用户密码,要求他们是可恢复的。
我正在考虑使用主密码+另一种加密机制来加密密码。
用于加密的密钥将保存在外部系统中,并且可以使用API检索。问题是我不确定是否:- 此方法足够安全
- 我应该选择哪种额外的加密机制
谢谢。
编辑 --------------我知道关门了……但我确实想澄清——我必须有解密的能力,这是我的应用程序的主要部分……说了这么多,我想我得到了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。