17

可能重复:
PHP 密码的安全哈希和盐

我正在制作一个在 MySQL 数据库中存储用户凭据(电子邮件、用户名和密码)的系统,并且在使用加密、加盐和加密类型方面看到了冲突的观点。

你会推荐什么最好的方法?用 MD5 还是 SHA1 编码?加盐还是不加盐?仅加密密码或所有 3 个元素?

4

5 回答 5

12

对于密码哈希使用PBKDF2它是NIST 批准的。您应该为每个密码和重要的(超过 1000 次)迭代计数使用随机的非秘密盐。

对于用户名和电子邮件,可能不值得加密。

于 2012-05-01T13:00:20.793 回答
7

IMO 的最佳做法是:

  • 使用散列算法,例如 SHA256 或 SHA512。MD5 现在是不安全的,因为您可以反转哈希/执行彩虹攻击。

  • 使用强盐来确保攻击者无法猜出常用的散列密码,如果他们获得了访问您的数据库的权限。

  • 不要使用加密。

  • 只有散列密码、用户名和电子邮件才可以作为纯文本。

于 2012-05-01T12:11:23.930 回答
3

这只是您需要加密的密码。实际上,您应该同时使用至少HashingSHA-256的算法(我很确定 MD5 和 SHA1 是可破解的?)并且您的密码更加安全。 Salting

这是关于存储它们的首选方法的答案:在数据库中存储密码的首选方法

于 2012-05-01T12:00:55.423 回答
2

用户名和电子邮件不应该被加密,你需要它们是纯文本的,那样它们会更有用。

至于密码:它们绝对应该被加密或散列,最好也用盐。到目前为止,我使用了一种有趣的技术来做到这一点:AES,其密钥就是密码本身。因此,如果用户将他的密码设置为“blabla123”,那么我将通过调用将其存储在 MySQL 中AES_ENCRYPT('blabla123', 'blabla123')。这样做有两个好处:

  • 您不会将加密密钥存储在任何地方
  • 每个密码都使用不同的密钥加密。因此,即使您找到了一把钥匙,它的用处也会受到限制。

然后通过加密用户键入的内容并比较两个值来完成有效性。

于 2012-05-01T12:05:18.707 回答
1

密码应使用强盐(MD5 或 SHA1 都可以)进行哈希保护,以防止使用彩虹表进行攻击。

您不应该对电子邮件地址进行哈希处理 - 一旦您对其进行哈希处理,除了检查用户输入的内容之外,您无法将其用于任何其他用途,因此对其进行哈希处理会阻止您向该人发送电子邮件。同样,用户名最好以纯文本形式存储,以便您识别该人。

于 2012-05-01T11:58:38.530 回答