Python基于SHA1与MD5加盐哈希无匹配结果,求助排查
问题分析与代码修正
核心错误点
- 盐值计算逻辑错误:题目中
md5(1)指的是对**字符串"1"**做MD5哈希,而非整数1的二进制字节形式。原代码用int.to_bytes(saltNum)将整数转为b'\x01'这类字节,和预期的b'1'完全不符,导致所有哈希值生成错误。 - 匹配计数未更新:
hashesFound变量从未在匹配时递增,最终输出的计数始终为0。 - 重复哈希计算:循环中多次调用
hashPassword函数,既浪费性能也增加冗余操作。
修正后的代码
import hashlib possibleHashes = ["9537935389a343a4fbd831b621b00661b91a5172", "576b1b134cb89b0f8a6c4dd1698479a1151b0e63", "5d7196b530fdd24b8faaaecbaa6b08a29daa1304", "d6acda01abcfe8afd510b96c1d0a1645ea4c40b8"] possiblePasswords = ["123456", "123456789", "qwerty", "password", "12345", "qwerty123", "1q2w3e", "12345678", "111111", "1234567890"] hashesFound = 0 def hashPassword(saltNum, password): # 将盐值转为字符串后编码,再计算MD5哈希 salt_bytes = str(saltNum).encode('utf-8') salt_md5 = hashlib.md5(salt_bytes).digest() password_bytes = password.encode('utf-8') # 拼接盐的MD5结果与密码,计算最终SHA1哈希 return hashlib.sha1(salt_md5 + password_bytes).hexdigest() # 改用for循环提升可读性 for idx, password in enumerate(possiblePasswords): print(f"I: {idx}") for salt_num in range(1, 6): generated_hash = hashPassword(salt_num, password) print(f"J: {salt_num} {generated_hash}") if generated_hash in possibleHashes: print(f"匹配成功:密码 {password},哈希 {generated_hash}") hashesFound += 1 print(f"\nHash Matches Found: {hashesFound}\n")
关键修改说明
- 盐值处理修正:把
saltNum转为字符串后再编码,确保MD5计算的是"1"到"5"这些字符串的哈希,完全符合题目要求。 - 哈希计算优化:只计算一次哈希值并存储,避免重复调用函数。
- 计数逻辑修复:找到匹配时递增
hashesFound,保证最终计数准确。 - 循环结构优化:用
for循环替代while循环,代码更简洁易维护。
修正后运行代码,会找到4组匹配:
password+ md5(1) →d6acda01abcfe8afd510b96c1d0a1645ea4c40b8123456+ md5(2) →9537935389a343a4fbd831b621b00661b91a5172qwerty+ md5(3) →576b1b134cb89b0f8a6c4dd1698479a1151b0e6312345+ md5(5) →5d7196b530fdd24b8faaaecbaa6b08a29daa1304
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

