加密概念:通过哈希函数对原始密码进行解密
常见哈希函数:MD5(通常显示为 32 位十六进制字符串,如e10adc3949ba59abbe56e057f20f883e),sha-256(64 位十六进制字符串),sha-128(40 位十六进制字符串)
特点:单向不可逆
通过其他间接手段找到与哈希值匹配的原始数据(密码)。这些手段本质上是 “猜”,而不是 “解”;核心逻辑是:通过计算大量可能的原始数据的哈希值,与目标哈希值比对,找到匹配项
那么根据以上特点,当我们遇到已知加密算法,原始密码类型与部分哈希值时,我们理论上是可以爆破出原始密码和完整的哈希值
具体思路:为定义原始密码的范围,生成当前长度的所有字符组合,枚举出对应的哈希值,与给出的前缀一致时输出
例题:Polar靶场misc broken_hash
图片加后缀打开在底部发现有rar压缩包,分离一下

打开压缩包有注释:7bf21a26cd6
import hashlib
rar_pwd = '????' # letters+digital
rar_pwd = hashlib.md5('????'.encode()).hexdigest()
第三行覆盖了原始变量
'????'.encode():将字符串转换为字节流(因为哈希函数处理的是字节,而非字符串)。hashlib.md5(...):创建 MD5 哈希对象并处理字节流。.hexdigest():将哈希结果转换为十六进制字符串(便于人类阅读和存储)。
已知部分哈希值:7bf21a26cd6,原始密码为4位数字加字母,定义原始密码范围是大小写字母和数字爆破,即匹配到对应哈希值前缀输出
import hashlib
import itertools
def crack_md5(target_part, max_length=4):
# 定义密码可能包含的字符集:大小写字母+数字
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
# 循环尝试从1到max_length位的密码
for length in range(1, max_length + 1):
# 显示当前尝试的密码长度(单行刷新)
print(f"尝试{length}位密码...", end='\r')
# 生成当前长度的所有字符组合(笛卡尔积)
for pwd_tuple in itertools.product(chars, repeat=length):
# 将元组转换为字符串
pwd = ''.join(pwd_tuple)
# 计算字符串的MD5哈希值(先编码为字节,再转十六进制)
md5_hash = hashlib.md5(pwd.encode()).hexdigest()
# 检查哈希值是否以目标前缀开头
if md5_hash.startswith(target_part):
print("\n匹配成功!")
print(f"原始密码: {pwd}")
print(f"完整哈希: {md5_hash}")
return pwd, md5_hash
# 所有长度尝试完毕未找到匹配
print("\n未找到匹配密码")
return None, None
if __name__ == "__main__":
# 目标MD5哈希前缀
target = '7bf21a26cd6'
# 已知密码为4位,仅尝试1-4位长度(提高效率)
crack_md5(target, max_length=4)

原始密码: H3lo
完整哈希: 7bf21a26cd627170e0e05ceee551c044
用哈希值给压缩包解密即可
flag{dbee4535f4853a3adc9ac3bbe1358819}
这道题我们通过以上三个条件成功破解了原始密码和对应的哈希值,但是这种方法只是理论成立,在一些实际情况下可能不太适用,主要有以下两点:
1.原始密码的 “搜索空间” 大小(最核心限制)
搜索空间即 “所有可能的候选密码数量”,由密码长度、字符集范围共同决定,计算公式为:
搜索空间 = 字符集大小 ^ 密码长度
例 1:4 位纯数字密码(字符集 10 个数字,长度 4)→ 10^4=1 万种组合,普通电脑毫秒级可爆破;
例 2:8 位 “字母 + 数字 + 特殊符号” 密码(字符集假设 94 个可打印字符,长度 8)→ 94^8≈6×10¹⁵种组合,即使每秒计算 1 亿次,也需要约 2 万年才能跑完;
2.加密算法的 “抗爆破设计”
现代密码哈希算法(如 Argon2、bcrypt、PBKDF2)会通过 “故意放慢计算速度” 来对抗爆破,直接增加时间成本
总结:适用与原始密码长度范围小,组成字符类型简单的密码(条件:已知原始密码大致长度范围与组成成分,哈希算法,部分哈希值)