存储用户名的最佳实践&

Best practice for storing usernames & password in MySQL Databases

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Secure hash and salt for PHP passwords

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

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


对于密码哈希,使用pbkdf2,它得到了NIST的批准。您应该为每个密码使用一个随机的非秘密salt,并对非琐碎的(超过1000次)迭代计数使用它。

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


IMO的最佳实践是:

  • 使用哈希算法,如sha256或sha512。MD5现在不安全,因为您可以逆转散列值/执行彩虹攻击。

  • 使用强salt确保攻击者无法猜测通常散列的密码,如果他们曾经进入您的数据库。

  • 不要使用加密。

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


你只需要加密密码。实际上,在一个至少是sha-256的算法中,你应该都是Hashing(这就是你说编码的意思)(我很确定md5和sha1是可以破解的?)和Salting你的密码要格外安全。

以下是存储密码的首选方法的答案:在数据库中存储密码的首选方法


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

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

  • 你不在任何地方存储加密密钥
  • 每个密码都使用不同的密钥加密。所以,即使你找到了一个关键点,它的有效性也会受到限制。

然后通过加密用户类型并比较2个值来实现有效性。


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

您不应该散列电子邮件地址-一旦散列,除了检查用户键入的内容外,您不能将其用于任何其他用途,因此散列会阻止您向此人发送电子邮件。同样,用户名最好以纯文本形式存储,以便您识别此人。