如何在mysql中创建带有密码字段的表?

16

我应该将密码列创建为普通的varchar,然后像这样插入数据吗:

sha1($pass_string)

或者我应该在创建表时采取额外措施来确保密码字段的安全性?

谢谢!

4个回答

15

这是一个普通的varchar字段(40个字符),但如果您想使其更安全,应该使用盐。

http://highedwebtech.com/2008/04/25/season-your-passwords-with-some-salt/

更新:

警告:不加盐的哈希密码非常脆弱!决不能使用它!!

加盐是正确的方法: password salting

根据pst的建议:

  • 使用SHA-1和盐是更朴素但相当安全的方法。

  • 使用bcrypt

这是更安全的方法 :) 因为它利用速度来使其更安全,bfish是围绕加密方法blowfish构建的哈希函数。(似乎twofish也存在,应该是blowfish的“现代”版本)。

这是一种使用SHA-1链的版本,因此它是中间解决方案,但允许根据需要设置速度。实际上,速度会削弱您的安全性。


2
还应该使用不同的(“更加计算密集”的)函数,例如bcrypt和/或使用HMAC哈希。 - user166390
2
是的,一定要加盐处理你的散列值。此外,如果你为每个用户使用不同的盐,可以帮助防止彩虹表攻击:http://en.wikipedia.org/wiki/Rainbow_table。 - Mac
@pst:你能提供更多细节吗? :) - ykatchou
@ykatchou https://dev59.com/S3I_5IYBdhLWcg3wBuRs(接受答案底部)和http://www.binarylogic.com/2008/11/22/storing-nuclear-launch-codes-in-your-app-enter-bcrypt-for-authlogic/ - 这并不是说SHA不是安全的哈希算法,而是因为单次调用太快了。由于bcrypt已经为此设计,我认为没有必要“再造一个”(除非你正在设计新的算法/方法)。 - user166390

2
你还可以使用mysql内置的AES_ENCRYPT()函数来提高安全性。 链接在这里 这里还有一个很好的指南,进一步解释了如何使用: 链接

2

手册中详细解释了应该使用哪种类型的列。


0

大多数人都像您建议的那样保存哈希值。它足够安全和简单,是一个不错的选择。

请注意,所有哈希值最终都可以被破解,因此任何哈希值都比没有好,而SHA足够强大。


2
这比那更糟糕 - 没有盐,一个微不足道的彩虹表攻击很容易就能破解它。此外,单个SHA对于密码来说并不是最理想的,因为它可以被极快地计算出来。(bcrypt和HMAC可以帮助解决这个问题。) - user166390
HMAC对于小于一个块的数据有用吗? - ykatchou
@ykatchou 噢,评论有点不正确。HMAC-SHA1 的设计并不是为了帮助速度,而是可以通过添加另一层强化的服务器秘密密钥来增加安全性。 - user166390
@pst:感谢您,我发现了bcrypt :) 它有助于提高速度! - ykatchou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接