假设我有一个用户设置表:
CREATE TABLE `users` (
`id` INTEGER PRIMARY KEY,
`name` TEXT,
`hashed_password` TEXT,
`salt` TEXT
)
创建用户后,会生成随机生成的salt,并将其与get_hash(salt + plaintext_password)
之类的结果一起存储在数据库中。
我想知道如果恶意用户获取这些数据,他们是否可以使用它来破解用户的密码?如果是这样,有什么方法可以防止它?
答案 0 :(得分:17)
不,他们没有用武之地。
只要你为每一行使用一种独特的盐,那么盐就会阻止减慢攻击速度。攻击者需要进行暴力攻击,而不是使用rainbow tables来防止密码哈希。
如评论中所述,您应确保盐的含量合理。
答案 1 :(得分:8)
Salting在UNIX / etc / passwd文件中引入(或至少受欢迎),这是世界可读的。通常假设破解者已知盐和加密密码。 salt的目的是减慢破解过程(因为相同的密码不会映射到相同的加密字符串); 本身并不是秘密。
答案 2 :(得分:4)
了解盐可以进行蛮力攻击,但这并不会使它变得无用。 Salt可以防止攻击者使用已经生成的彩虹表(您可以在网上找到)。
防止暴力破解的最佳方法就是使用冗长复杂的密码。
答案 3 :(得分:2)
如果攻击者知道salt,哈希密码和哈希算法,那么他们就可以发起暴力字典攻击(或彩虹攻击)。
答案 4 :(得分:1)
要成功攻击帐户,攻击者需要知道该帐户的盐(并且每个帐户的盐应该不同),使用哈希算法,和最终存储的密码哈希。
鉴于所有该信息,您可以编写一个程序,一直尝试散列不同的潜在密码,直到找到匹配的密码。
如果它是坏盐(太简单或太短),这可以更快,因为程序可以使用彩虹查找表将最终存储的密码哈希与经过哈希处理的字符串相匹配,然后只需减去盐。但他们仍然需要所有的信息。
如果它是共享盐,这是不好的,因为攻击者并使用盐预先生成彩虹表,这对您系统上的任何帐户都有好处。
答案 5 :(得分:1)
这应该让你知道它是如何工作的。
假设你想加密“秘密”一词。在加密后,让我们说它现在看起来像这个00110010.
如果黑客知道加密算法,他们可以创建一个单词表及其相应的加密值。因此,他们采用加密密码“00110010”并在表中找到它。现在他们知道用于生成“00110010”的密码是“秘密”这个词。如果你先把这个词加盐,那么通用查找表对黑客来说就没用了。 (通用查找表是未加盐的字典单词及其加密值的表格)
如果你先把这个词加盐(“saltsecret”),现在加密的值看起来会有所不同,而且黑客不会在查找表中找到它。
但是,他们仍然可以使用您的salt从头开始创建自己的查找表,最终他们将能够反向查找密码。
所以要回答这个问题,如果密码足够复杂,黑客需要很长时间才能弄明白。你可以每年更换盐,他们必须重新开始创建一个表。
答案 6 :(得分:0)
假设MD5的强力攻击,使用GPU的SHA1,SHA256算法的吞吐量大于每秒10亿次尝试,SHA512大约为300M / s。如果您使用其中一种算法,它将减慢使用彩虹表的黑客(不太可能),但它不会减慢使用暴力攻击的黑客(更有可能)。它绝对不会保护你,它只是为过时的彩虹表添加一点安全性(对于这些算法)。有点比没有好。
但是如果你使用一个最强的算法(例如bcrypt),即使用哈希存储,盐肯定也值得,因为在时间上不可行,因此彩虹是有意义的。
看看这个 article并总结:
如果您是用户:
确保所有密码都是12个字符或更多,理想情况下更多。我建议使用密码短语,它不仅比密码(如果不是类型)更容易记住,而且由于长度的原因,还可以非常安全地防止暴力破解。
如果您是开发人员:
专门使用bcrypt或PBKDF2来散列您需要安全的任何内容。这些新的哈希值专门设计为难以在GPU上实现。不要使用任何其他形式的哈希。几乎所有其他流行的哈希方案都容易受到商品GPU阵列的强制攻击,这些GPU每年只能更快,更平行,更容易编程。
Jeff Atwood发表