已知部分哈希值的密码恢复

加密概念:通过哈希函数对原始密码进行解密

常见哈希函数: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)会通过 “故意放慢计算速度” 来对抗爆破,直接增加时间成本

总结:适用与原始密码长度范围小,组成字符类型简单的密码(条件:已知原始密码大致长度范围与组成成分,哈希算法,部分哈希值)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇