更新:请注意,我不是在问什么是盐,什么是彩虹表,什么是字典攻击,或者盐的目的是什么。我在问:如果你知道用户salt和hash,计算他们的密码不是很容易吗?
我了解这个过程,并在我的一些项目中自己实施。
s = random salt
storedPassword = sha1(password + s)
在您存储的数据库中:
username | hashed_password | salt
我见过的每个加盐的实现都会在密码的末尾或开头添加盐:
hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)
因此,来自值得他的盐(哈哈)的黑客的字典攻击将简单地针对上面列出的常见组合中存储的盐运行每个关键字。
当然,上面描述的实现只是为黑客增加了另一个步骤,而没有真正解决根本问题?有什么替代方法可以绕过这个问题,还是我误解了这个问题?
我唯一能想到的就是有一个秘密混合算法,将盐和密码以随机模式结合在一起,或者将其他用户字段添加到散列过程中,这意味着黑客必须能够访问数据库和代码才能结合他们进行字典攻击以证明卓有成效。(更新,正如评论中指出的那样,最好假设黑客可以访问您的所有信息,所以这可能不是最好的)。
让我举一个例子,说明我建议黑客如何使用密码和哈希列表来破解用户数据库:
来自我们被黑数据库的数据:
RawPassword (not stored) | Hashed | Salt
--------------------------------------------------------
letmein WEFLS... WEFOJFOFO...
常用密码字典:
Common Password
--------------
letmein
12345
...
对于每个用户记录,循环常用密码并对它们进行哈希处理:
for each user in hacked_DB
salt = users_salt
hashed_pw = users_hashed_password
for each common_password
testhash = sha1(common_password + salt)
if testhash = hashed_pw then
//Match! Users password = common_password
//Lets visit the webpage and login now.
end if
next
next
我希望这能更好地说明我的观点。
给定 10,000 个常用密码和 10,000 条用户记录,我们需要计算 100,000,000 个哈希来发现尽可能多的用户密码。这可能需要几个小时,但这不是一个真正的问题。
开裂理论更新
我们将假设我们是一个损坏的虚拟主机,它可以访问 SHA1 哈希和盐的数据库,以及混合它们的算法。该数据库有 10,000 条用户记录。
该站点声称能够使用 GPU 每秒计算 2,300,000,000 次 SHA1 哈希。(在现实世界的情况下可能会更慢,但现在我们将使用引用的数字)。
(((95^4)/2300000000)/2)*10000 = 177 秒
给定 95 个可打印 ASCII 字符的完整范围,最大长度为 4 个字符,除以计算速率(变量)除以 2(假设发现密码的平均时间平均需要 50% 的排列)为 10,000用户需要 177 秒才能计算出长度为 <= 4 的所有用户密码。
让我们稍微调整一下以适应现实。
(((36^7)/1000000000)/2)*10000 = 2 天
假设不区分大小写,密码长度 <= 7,只有字母数字字符,解决 10,000 条用户记录需要 4 天,并且我将算法的速度减半以反映开销和非理想情况。
重要的是要认识到这是一种线性蛮力攻击,所有计算都是相互独立的,因此它是多个系统解决的完美任务。(IE 很容易设置 2 台计算机从不同端运行攻击,执行时间减半)。
考虑到对密码进行 1000 次递归散列以使该任务的计算成本更高的情况:
(((36^7) / 1 000 000 000) / 2) * 1000 秒 = 10.8839117 小时
这表示最大长度为 7 个字母数字字符,执行速度低于一位用户引用的数字的一半。
递归散列 1,000 次有效地阻止了全面攻击,但对用户数据的针对性攻击仍然容易受到攻击。