1

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

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

加密密钥将保存在外部系统中,并且可以使用 API 进行检索。问题是我不确定是否:

  1. 这种方法足够安全
  2. 我应该为加密选择哪种附加机制。

谢谢。

编辑--------------我知道它已关闭...但我确实想澄清一下-我必须有解密的能力,这是我的应用程序的主要部分...与据说我想我用 AES 算法得到了答案。我不需要散列,因为散列是不可逆的

4

4 回答 4

5

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

这个问题比较适合安全论坛

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

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

如果您正在寻找散列密码(这是密码存储的标准),则不需要密钥。使用SHA1算法。就输出的大小而言,它是当前使用的更安全的哈希算法。其他选项是SHA256SHA512

编辑:哦,时代在变。哈希算法也是如此!人们正在从 SHA 系列散列算法转移到 Bcrypt,它具有其他几个功能,例如引入成本因子来防止彩虹表。

于 2013-03-06T17:31:37.290 回答
1

这是您的必读内容:您可能错误地存储了密码

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


您可能要求解决错误的问题。我怀疑您想创建一项功能来恢复密码...在这种情况下,如果您不介意,我会将您发送到我以前的答案之一。


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


否则,您基本上设计了所有存储密码将被盗的方式。要么是因为现在被认为是安全的东西明天可能不再被认为是安全的,要么是因为我们是人类(对吗?)我们可以犯错误。

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

于 2013-03-06T17:36:43.860 回答
1

我不确定 [...] 这种方法是否足够安全

不,不是。大多数允许恢复密码而不是重置密码的安全方法的任何密码存储方法都不被认为是“安全的”。此外,用户如何发送他们的“恢复”密码?因为使用电子邮件来做到这一点几乎是最糟糕的方法。

如果您无法解决必须能够“恢复”密码的问题,那么您想要的是非对称[aka public key] 加密。密码将由公钥加密并存储在数据库中以进行比较。私钥应该分开保存,最好是离线保存在保险箱中的记忆棒上,并且至少受一个密码保护,如果不是两个或更多密码由不同的人持有的话。

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

于 2013-03-06T17:38:32.203 回答
0

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

if (sha1($str) === 'd0be2dc421be4fcd0172e5afceea3970e2f3d940') { echo "你想要一个绿色还是红色的苹果?"; }

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

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

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

或者,如果您不能使用 bcrypt 或 scrypt 和 SHA2,则最好使用 PBKDF2。

于 2013-03-06T17:34:55.307 回答