md5($password.md5($password))
这对于密码哈希是否足够好?我并不是要求将此与bcrypt进行比较。
如果不安全,请告诉我原因。
答案 0 :(得分:33)
为每个用户的密码使用不同的盐的原因是,攻击者无法获取所有散列密码的列表,并查看其中是否有任何符合“密码”或“12345”之类的哈希值的哈希值。如果您使用密码本身作为salt,则攻击者可以计算md5("12345".md5("12345"))
并查看它是否与任何条目匹配。
据我了解,您可以在密码表上使用四种级别的哈希:
有关详细信息,请查看编码恐怖帖子“You're probably storing passwords incorrectly”。
答案 1 :(得分:4)
虽然对我来说似乎已经足够了,如果有人根据相同的算法预先计算了彩虹表,那么它将处于危险之中(很可能)。 因此,我宁愿使用电子邮件来获取盐,这似乎非常安全但可用。偏执狂可以添加一些恒定的全站点盐。
人们经常从密码盐(理论上)中做出太大的贡献,而在他们的应用程序中,他们允许使用简单的密码,并在实际中通过不安全的HTTP以纯文本形式传输它们。
每一天我都会看到有关盐或哈希的问题 而且没有一个关于密码复杂性的问题。而
为什么呢?让我演示给你看。
非常好的盐+弱密码=在几秒钟内可破解
人们总是认为攻击者知道盐。因此,通过使用一些最常用密码的字典并向其添加[任意超级随机超长]盐,可以在几秒钟内发现弱密码。粗暴的短密码也是如此。
只是敏感盐+强密码=牢不可破
相当独特的盐使得预先计算的表毫无用处,而且良好的密码使得字典和暴力攻击都无济于事。
答案 2 :(得分:2)
它对字典攻击没有太大作用,计算字典的难度是单个md5
的两倍,而md5
现在相当便宜。
答案 3 :(得分:2)
MD5本身并不安全,因为它部分断裂(碰撞)并且无论如何都太小了。如果一个人不想使用正确的密码派生函数àlabcrypt,scrypt或PBKDF2你至少应该使用SHA-256进行新的设计(并计划迁移到SHA-3时) out,所以一定要存储你用来使用结果散列密码的方案,这样当人们更改密码时,当你使用新的哈希程序时,两个方案都可以共存。)
如果您打算以任何身份使用MD5销售您的程序,可以成为大多数政府销售的显示阻止(例如,在美国使用的算法必须通过FIPS 140-2认证,而许多其他国家/地区也有同样的要求)。
答案 4 :(得分:1)
建议使用随机密码盐进行散列密码的原因,以便知道密码哈希的攻击者无法将其与预先计算的字典散列的rainbow table进行比较。
如果您使用密码作为salt,攻击者可以先从字典中预先计算$ word.md5($ word)的哈希值
答案 5 :(得分:1)
使用您的解决方案,您几乎无法使用盐来预先计算字典攻击。
使用预先计算的字典,顾名思义,有人已经提前为特定单词创建了哈希表(计算出的md5
结果)。
考虑这个表hashtable
(带有假想的哈希值,仅用于说明目的)
word | hash
------------
foo | 54a64
bar | 3dhc5
baz | efef3
针对您的表测试这些值可能非常简单:
SELECT h.word
FROM hashtable h, yourtable y
WHERE y.password = MD5( CONCAT( h.word, h.hash ) );
有了匹配,你就有了密码。
但是,如果您没有对密码进行哈希处理,在再次使用密码连接密码并再次对其进行哈希处理之前,使用预先计算的字典对其进行攻击会更加困难。因为密码将是例如md5( 'testtest' )
,这使得预先计算的表毫无价值,如果预先计算的表只考虑了单词的单个实例。
如果您不使用密码作为salt,但是使用另一个随机字符串作为salt,您可以很容易地看到它变得更加困难。当你为每个密码创建独特的盐时,它仍然变得更加困难。当然,如果您为每个密码创建唯一的salt,则必须将salt与密码保存在一个单独的列中。
所以我的建议是:
md5( 'uniquesalt' . 'password' );
或者实际上,根本不要使用md5
,而是使用更好的sha1
,sha256
(或更高)哈希算法。