字典攻击中攻击者如何确定算法与盐值?哈希密码比对机制解析
密码破解与哈希比对的核心问题解答
Great question—this is a common point of confusion when you first connect the dots between password hashing and dictionary/brute-force attacks. Let’s break down each part clearly:
1. 字典中的明文密码如何与泄露的哈希值比对?
哈希函数是单向不可逆的,你没法把哈希值“反推”回原始明文。攻击者用的是反向验证思路:
- 遍历字典里的每一个明文密码,用目标服务器存储密码时用的同款哈希算法(如果有盐值也要带上)重新生成哈希。
- 把生成的哈希和泄露的哈希值做字符串比对,一旦两者完全一致,就说明这个明文密码是匹配的。
打个比方,这就像用钥匙试锁:你没法拆锁得到钥匙,但可以挨个试手里的钥匙,直到有一把能打开锁。
2. 破解工具如何生成对应哈希并完成比对?
像John the Ripper、Hashcat这类现代破解工具,内置了对几百种哈希算法的支持,流程大概是这样:
- 你告诉工具要使用的哈希算法(比如在John里用
--format=bcrypt指定bcrypt,或者在Hashcat里用-m 3200这个对应bcrypt的数值编码)。 - 工具遍历字典文件里的每一条明文。
- 对每个明文,用指定的哈希算法(包括盐值处理逻辑)生成哈希值。
- 把生成的哈希和你提供的泄露哈希列表做比对,匹配上就把明文密码标记为破解成功。
举个Hashcat的简单命令示例,针对SHA-512crypt类型的哈希列表:
hashcat -m 1800 -a 0 leaked_hashes.txt rockyou.txt
-m 1800指定SHA-512crypt算法-a 0启用字典攻击模式leaked_hashes.txt是你拿到的泄露哈希文件rockyou.txt是一个常用的通用密码字典
3. 攻击者如何获知应采用的算法与盐值?
这取决于目标系统存储哈希的方式,常见的几种场景:
- 和哈希存在一起:大部分安全系统会把哈希存在带格式的字符串里,直接包含算法标识和盐值。比如:
- Bcrypt格式:
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy($2a$代表bcrypt,10是成本因子,后面一段就是盐值) - SHA-512crypt格式:
$6$rounds=10000$saltstring$hash($6$标记这是SHA-512crypt)
攻击者直接解析这个字符串就能拿到算法和盐值。
- Bcrypt格式:
- 已知系统默认配置:如果目标用的是流行的CMS、框架或服务,攻击者可以查它的默认哈希配置(比如WordPress早年用MD5,现在用PHPass,格式里也包含算法和盐值信息)。
- 哈希识别工具:像
hashid这类工具,会分析哈希的长度、字符集、格式特征来猜测算法。比如32位十六进制字符串大概率是MD5,64位的可能是SHA-256。 - 暴力尝试常见算法:如果以上方法都不行,攻击者会挨个尝试主流哈希算法。因为大部分系统只会用少数几种知名哈希(MD5、SHA-1、bcrypt、Argon2),对小型哈希列表来说,这种尝试是可行的。
内容的提问来源于stack exchange,提问作者andjava




