更新:请注意,我并不是在询问什么是盐,什么是彩虹表,什么是字典攻击,或者盐的目的。我的问题是:如果你知道用户的盐和哈希值,那么计算他们的密码是否变得非常容易?
我理解这个过程,并在我的一些项目中实现了它。
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亿个哈希值。这可能需要几个小时,但这并不是真正的问题。
破解理论更新
我们假设自己是一个腐败的网络托管商,可以访问SHA1哈希值和salt的数据库以及您混合它们的算法。该数据库有10,000个用户记录。
此网站声称使用GPU每秒可以计算2,300,000,000个SHA1哈希值。(在实际情况下可能会慢一些,但现在我们将使用该引用数字)。
(((95^4)/2300000000)/2)*10000 = 177 秒
考虑到95个可打印ASCII字符的全部范围,最大长度为4个字符,除以计算速率(变量),再除以2(假设平均发现密码时间将平均需要50%的排列组合),对于10,000个用户而言,如果密码长度小于或等于4,则需要177秒来找出所有用户的密码。
让我们调整一下以使其更符合现实。
(((36^7)/1000000000)/2)*10000 = 2天
假设不区分大小写,密码长度小于或等于7个字符,只使用字母数字字符,则需要4天才能为10,000个用户记录解决问题,并将算法的速度减半以反映开销和非理想情况。
重要的是要认识到这是一个线性暴力攻击,所有计算都是独立的,因此它是多系统解决的完美任务。(比如易于设置两台电脑从不同的端口运行攻击,可以将执行时间缩短一半)。
考虑到递归地哈希密码1,000次可使此任务的计算成本更高:
(((36^7) / 1 000 000 000) / 2) * 1000 秒 = 10.8839117小时
这表示最大长度为7个字母数字字符,对于一个用户而言,执行速度不足引用数字的一半。
递归哈希1,000次有效地阻止了一次性攻击,但用户数据仍然容易受到有针对性的攻击。