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次)迭代计数使用它。
对于用户名和电子邮件,可能不值得加密。
- +1对于pbkdf2更好,尽管我通常在性能不是问题时使用10000次迭代;)例如:csharptest.net/470/…
- @csharptest.net我同意您的迭代计数,很好的例子。
IMO的最佳实践是:
- +1散列邮件和用户名很难处理,因为它们通常也不区分大小写。
- 这不是正确的答案。您希望使用正确的密码散列函数,如pbkdf2或bcrypt。
- @我的回答不正确。您建议使用更强大的哈希函数,但是sha256和512仍然有效,因为没有发现哈希冲突。
- @达伦达维认为,问题不在于冲突,而在于猜测密码的时机。易建联可以在GPU上每秒至少完成2.3亿次哈希运算。这意味着你可以大致猜出很多密码。考虑到大多数密码都很短,这使得sha1变得毫无价值。这里概述了这一点的逻辑。它建议使用不同的函数bcrypt,但是逻辑和要点是相同的:密码散列函数的猜测速度应该很慢,而sha1/256的设计速度应该很快。codahale.com/how-to-safety-store-a-密码
- @你在说什么?我不推荐Sha1……
- 我并不是专门谈论sha1,尽管这恰好是我可以快速找到数据的原因。你一秒钟至少可以做6500万个sha256哈希,而我从中得到的这个站点看起来很老很过时。insidepro.com/eng/egb.shtml逻辑适用于任何通用哈希函数。sha 256/512更难发生冲突,也更难反转(在给定随机输入的输出之后,恢复输入,而不是验证输入的猜测)。它们被设计成计算速度快。如果他们很快,你可以很快猜出密码。
你只需要加密密码。实际上,在一个至少是sha-256的算法中,你应该都是Hashing(这就是你说编码的意思)(我很确定md5和sha1是可以破解的?)和Salting你的密码要格外安全。
以下是存储密码的首选方法的答案:在数据库中存储密码的首选方法
用户名和电子邮件不应该加密,你需要它们是纯文本的,这样它们会更有用。
至于密码:它们应该绝对加密或散列,最好使用salt。到目前为止,我使用了一种有点有趣的技术来做到这一点:aes,其关键是密码本身。因此,如果用户将其密码设置为"blabla123",那么我将通过调用AES_ENCRYPT('blabla123', 'blabla123')将其存储在MySQL中。这有两个优点:
- 你不在任何地方存储加密密钥
- 每个密码都使用不同的密钥加密。所以,即使你找到了一个关键点,它的有效性也会受到限制。
然后通过加密用户类型并比较2个值来实现有效性。
- 我爱这个…
- 我也喜欢这种方法!如果你用这种方法,也值得加盐吗?
- @PhilfacePlantYoung,我想你应该加点盐。这是开放的彩虹攻击没有盐。
- 这个答案为使用散列而不是加密提供了一些很好的参数。
- 因此,研究mysql aes_encrypt函数,它不使用iv,所以对于8个字符的密码,它们只需要16个字节,所以在彩虹表中,它的大小是sha256表的一半。从实现的角度来看,它不使用密钥派生函数,基本上用零填充短密钥,因此它将很快强制所有弱密码生成彩虹表。更不用说,没有什么能使一个以上的密码不可能加密到同一个密码上。最好使用基于安全散列的更标准的东西。
- 这种散列技术有多强?,AES加密密码是否比sha1更安全?,使用与密钥相同的字符串加密字符串是否安全?,-我认为大家的共识是,这不是一种行之有效的散列密码的方法。
- @谢谢你的链接。但我认为,如果黑客很快就可以破解这种存储密码的方法,那么您存储密码的方法就不会有太大的不同。为什么?因为他不会找出一些密码,而是删除表中的所有数据,然后崩溃服务器上的所有内容…
- -1表示建议在密码上使用加密,-1表示"最好使用salt",-1表示AES用密码加密密码的想法非常糟糕,-1表示不建议使用pbkdf2。--简而言之:不要用这个答案--
- Sobolan有很多方法可以获得密码表,但这并不意味着您可以访问实时数据库。即使这条大道真的喜欢SQL注入攻击,为什么取下服务器要比偷来的用户名、电子邮件、密码更有价值呢?这些密码也可以很好地用来访问其他站点。更进一步,彩虹表的全部意义在于它使暴力强迫变得有价值,因为它可以反复使用,所以黑客不需要熟练,他们只需下载别人所做的,这在这种情况下更容易,因为你的哈希很短。
- -1不要这样做。正如其他人所说,您希望使用专门设计的密码散列函数,这些函数很慢。这样攻击者就不能简单地迭代所有可能的密码。你可以在GPU上每秒至少做2.3亿次哈希运算。使用像pbkdf2这样的具有大量迭代计数、bcrypt或scrypt的工具来安全地完成这项工作。它们的设计目的是大大降低攻击者的速度
- 我真的想删除这个,但我不能…既然这是一个公认的答案…
密码应该使用强盐散列保护(MD5或SHA1都可以),以防止使用彩虹表进行攻击。
您不应该散列电子邮件地址-一旦散列,除了检查用户键入的内容外,您不能将其用于任何其他用途,因此散列会阻止您向此人发送电子邮件。同样,用户名最好以纯文本形式存储,以便您识别此人。