求助:基于提示字符串破解SHA256哈希(Python实现)
破解基于个人信息提示的8位SHA256哈希密码
已知条件
- 目标SHA256哈希:
0ba128bd856006948e7c57b714586bf43199aa898cc2bcd25141d951a34664a8 - 密码固定长度:8
- 个人信息提示列表:
- ("Lars","Hansen","05","09","1984")
- ("fido")
- ("jan","08","08","2014")
- ("barcelona","fodbold")
现有代码的问题分析
- 数据提取逻辑混乱:原代码用
it.chain(user_info).from_iterable(user_info)处理提示信息,导致"fido"被拆分为单个字符,后续手动修改片段的操作容易遗漏有效候选,且逻辑不可复用。 - 候选片段范围过窄:仅提取每个字符串的前两位,忽略了完整短串(如"fido"是4位,可直接作为半段密码)、长串的关键子串(如"barcelona"的前/后4位)、日期组合(如"0509""1984")等常见密码元素。
- 组合方式单一:仅尝试4个2位片段的拼接,未考虑其他长度组合(如两个4位、4位+两个2位等),覆盖范围不足。
优化思路与解决方案
核心思路
从提示信息中提取所有可能的有效候选片段,生成所有总长度为8的片段组合,逐一计算哈希比对。
优化代码示例
import itertools import hashlib # 基础配置 target_hash = "0ba128bd856006948e7c57b714586bf43199aa898cc2bcd25141d951a34664a8" password_length = 8 hints = [ ("Lars", "Hansen", "05", "09", "1984"), ("fido",), ("jan", "08", "08", "2014"), ("barcelona", "fodbold") ] # 提取所有可能的候选片段 candidates = [] for group in hints: for item in group: # 添加完整短串(长度≤8)及大小写变体 if len(item) <= password_length: candidates.append(item) candidates.append(item.lower()) candidates.append(item.upper()) # 添加4位子串(适配8=4+4的组合)及大小写变体 if len(item) >= 4: candidates.append(item[:4]) candidates.append(item[-4:]) candidates.append(item[:4].lower()) candidates.append(item[-4:].upper()) # 添加2位子串(适配多段2位组合)及大小写变体 if len(item) >= 2: candidates.append(item[:2]) candidates.append(item[-2:]) candidates.append(item[:2].lower()) candidates.append(item[-2:].upper()) # 去重+过滤无效长度 candidates = list(set(candidates)) candidates = [c for c in candidates if 1 <= len(c) <= password_length] # 定义所有可能的长度组合(总长度=8) valid_length_combos = [ (4, 4), (2, 2, 2, 2), (4, 2, 2), (2, 4, 2), (2, 2, 4), (8,) # 直接8位完整片段 ] # 遍历所有组合可能性 for length_set in valid_length_combos: segment_lists = [] for l in length_set: segment_lists.append([c for c in candidates if len(c) == l]) for combo in itertools.product(*segment_lists): candidate_password = ''.join(combo) computed_hash = hashlib.sha256(candidate_password.encode('utf-8')).hexdigest() if computed_hash == target_hash: print(f"匹配密码:{candidate_password}") exit() # 额外尝试日期类完整8位组合 date_candidates = [ "05091984", "19840509", "08082014", "20140808" ] for date_pwd in date_candidates: if hashlib.sha256(date_pwd.encode('utf-8')).hexdigest() == target_hash: print(f"匹配密码:{date_pwd}") exit() print("未找到匹配密码,可尝试扩展候选片段(如名字拼接子串、特殊字符变体等)")
关键优化点
- 全面提取候选片段:覆盖完整短串、4位/2位子串,同时补充大小写变体,符合密码常见规律。
- 多维度组合方式:遍历所有可能的长度组合,确保不遗漏任何符合8位长度的拼接方式。
- 去重与过滤:减少无效计算,提升破解效率。
- 针对性补充:单独处理日期类完整8位组合,这类是密码的高频选择。
内容的提问来源于stack exchange,提问作者Skoven
相关产品推荐
相关产品推荐

