存储用户名的最佳实践&;MySQL数据库中的密码

存储用户名的最佳实践&;MySQL数据库中的密码,mysql,database,database-design,encryption,password-encryption,Mysql,Database,Database Design,Encryption,Password Encryption,可能重复: 我正在制作一个在MySQL数据库中存储用户凭据(电子邮件、用户名和密码)的系统,并且在使用加密、加密和加密类型时遇到了相互冲突的观点 你推荐的最佳方法是什么?用MD5或SHA1编码?加盐还是不加盐?仅加密密码或全部3个元素?应使用浓盐(MD5或SHA1都可以)对密码进行哈希保护,以防止使用rainbow表进行攻击 你不应该对电子邮件地址进行散列-一旦你对其进行了散列,除了检查用户键入的内容之外,你就无法将其用于任何其他用途,因此对其进行散列将阻止你向此人发送电子邮件。同样,用户名最

可能重复:

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


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

应使用浓盐(MD5或SHA1都可以)对密码进行哈希保护,以防止使用rainbow表进行攻击


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

实际上,您只需要加密密码。实际上,你应该在一个至少SHA-256(我很确定MD5和SHA1是可破解的?)的算法中进行
散列
(这就是你所说的编码)和
盐渍
你的密码,以确保额外的安全


这里有一个关于存储它们的首选方法的答案:

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

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

  • 您不会将加密密钥存储在任何位置
  • 每个密码都使用不同的密钥加密。因此,即使你找出一个关键点,它的实用性也会受到限制

然后通过加密用户类型并比较两个值来验证有效性。

IMO的最佳实践是:

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

  • 使用一种强力盐,以确保攻击者无法猜到通常散列的密码,如果他们曾经进入您的数据库

  • 不要使用加密

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

对于密码哈希,请使用它的。您应该为每个密码和非平凡(超过1000)的迭代计数使用随机的非秘密salt


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

@PhilFaceplantYoung,我想你应该在这封信上加盐。这是不含盐的rainbow攻击。这为使用哈希而非加密提供了一些很好的论据。-1建议在密码上使用加密,-1表示“最好使用盐”,1表示建议使用密码对密码进行AES加密,这是一个非常糟糕的主意,-1表示不建议使用PBKDF2--简而言之:不要使用这个答案——1不要这样做。正如其他人所说,您希望使用专门设计的速度较慢的密码哈希函数。这样,攻击者就不能简单地遍历所有可能的密码。在GPU上,每秒至少可以进行23亿次sha1哈希运算。使用像PBKDF2这样的大型迭代计数、bcrypt或scrypt来安全地执行此操作。他们的设计是为了大大降低攻击的速度。实际上,我想删除这个,但我不能。。。因为这是一个公认的答案…+1哈希电子邮件和用户名将是困难的,因为它们通常也不区分大小写。这不是正确的答案。您希望使用正确的密码哈希函数,如PBKDF2或bcrypt。@imichaelmiers-这并不意味着我的答案不正确。您建议使用更强的哈希函数,但SHA256和512仍然有效,因为未找到哈希冲突。@DarrenDavies问题不是冲突,现在是尝试猜测密码的时候了。Yi u在gpu上每秒至少可以进行2300百万次sha1哈希。这意味着您可以大致猜出这么多密码。鉴于大多数密码都很短,这使得sha1变得毫无价值。这里概述了这方面的逻辑。它建议使用不同的函数bcrypt,但逻辑和要点是相同的:密码散列函数在限制猜测方面应该很慢,而sha1/256在设计上很快。我并不是专门谈论sha1,尽管这恰好是我可以很快找到的数据。你可以每秒进行至少6500万次sha256散列,而我从中获得的站点看起来很陈旧。该逻辑适用于任何通用哈希函数。SHA 256/512更难发生冲突,也更难反转(因为在给定随机输入的输出时,恢复输入,而不是验证输入的猜测)。它们被设计成计算速度快。如果它们很快,您可以快速猜出密码请不要使用MD5或SHA1。它们在加密方面都是不可靠的。PBKDF2的+1要好得多,尽管在性能不成问题的情况下,我通常使用10000次迭代;)举个例子:@csharptest.net我同意你的迭代次数,很好的例子。