更新:请注意,我并不是在问盐是什么,彩虹表是什么,字典攻击是什么,盐的目的是什么。我正在查询:如果您知道用户盐和哈希,那么计算他们的密码不是很容易吗?
我了解该过程,并在我的一些项目中亲自实施了该过程。
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个哈希值才能发现尽可能多的用户密码。可能要花费几个小时,但这并不是真正的问题。
开裂理论的最新进展
我们将假设我们是一个损坏的Web主机,可以访问SHA1哈希和盐的数据库以及将它们混合的算法。该数据库有10,000个用户记录。
该站点声称能够使用GPU每秒计算2300,000,000 SHA1哈希。(在现实世界中,情况可能会变慢,但现在我们将使用引用的数字)。
((((95 ^ 4)/ 2300000000)/ 2)* 10000 = 177秒
给定一整套95个可打印ASCII字符,最大长度为4个字符,再除以计算率(变量)再除以2(假设发现密码的平均时间平均需要50%的排列)用户计算长度小于等于4的所有用户密码将花费177秒。
让我们为现实做些调整。
((((36 ^ 7)/ 1000000000)/ 2)* 10000 = 2天
假设不区分大小写,密码长度<= 7,仅字母数字字符,则要花4天的时间才能解决10,000条用户记录,并且我将算法的速度减半以反映开销和不理想的情况。
重要的是要认识到这是线性蛮力攻击,所有计算彼此独立,因此这是解决多个系统的理想任务。(即,IE易于设置两台从不同端运行攻击的计算机,这将使执行时间减少一半)。
考虑到递归地对密码进行哈希处理1000次以使此任务在计算上更加昂贵的情况:
((((36 ^ 7)/ 1000000000000)/ 2)* 1000秒= 10.8839117小时
这表示最大长度为7个字母数字字符,对于一个用户而言,其执行速度不到引用报价的一半。
递归散列1000次有效地阻止了全面攻击,但是针对用户数据的针对性攻击仍然容易受到攻击。