如何破解自定义SHA-256加盐哈希获取用户明文密码?
破解自有数据库中SHA-256截断哈希的方法
首先先明确你的哈希计算逻辑,避免后续操作出错:
哈希生成规则:
truncate(hexstring(SHA256("potPlantSalt" + password + salt)), 32)
也就是先拼接固定字符串potPlantSalt、明文密码、用户salt5aa8698c4022fe1d,计算SHA-256哈希后转成十六进制字符串,最终取前32个字符存入数据库。
核心思路:字典攻击(优先推荐)
既然是处理自己的数据库(务必确保合法授权!未经授权破解他人数据是违法行为),最高效的方式就是字典攻击——用常见密码列表逐一按照规则计算哈希,和目标哈希对比匹配。
具体实现方法
方法1:Python脚本(适合新手,直观易理解)
写个简单的Python脚本,自动遍历密码字典并对比哈希:
import hashlib # 配置参数 FIXED_STRING = "potPlantSalt" TARGET_HASH = "2b1ac087bd54ea9dcbfba2c3e63b2335" USER_SALT = "5aa8698c4022fe1d" DICTIONARY_PATH = "rockyou.txt" # 替换成你的字典文件实际路径 def find_password(): with open(DICTIONARY_PATH, "r", encoding="latin-1") as dict_file: for line in dict_file: password = line.strip() # 拼接字符串并计算哈希 combined_input = FIXED_STRING + password + USER_SALT hash_result = hashlib.sha256(combined_input.encode()).hexdigest() # 截断前32位字符 truncated_hash = hash_result[:32] # 对比哈希 if truncated_hash == TARGET_HASH: print(f"✅ 找到明文密码:{password}") return print("❌ 字典中未找到匹配的密码,建议更换字典或尝试掩码攻击") if __name__ == "__main__": find_password()
使用说明:
- 下载常用密码字典(比如
rockyou.txt,这是最流行的通用密码字典,注意需要解压后使用)。 - 修改脚本中的
DICTIONARY_PATH为你的字典文件实际路径。 - 运行脚本,等待结果即可。
方法2:Hashcat(高效,适合大规模字典或GPU加速)
如果你有GPU,Hashcat的破解效率会比Python脚本高很多,步骤如下:
- 创建哈希文件
hash_target.txt,内容格式为[目标哈希]:[用户salt]:
2b1ac087bd54ea9dcbfba2c3e63b2335:5aa8698c4022fe1d
- 运行Hashcat命令:
hashcat -m 0 -a 0 hash_target.txt rockyou.txt --custom-rule '^potPlantSalt $2' --output-found found_password.txt
-m 0:指定哈希类型为SHA-256-a 0:指定攻击模式为字典攻击--custom-rule:自定义拼接规则,把固定字符串potPlantSalt加在密码前缀,再拼接用户salt--output-found:把找到的密码输出到指定文件
进阶:掩码攻击(如果字典攻击失败)
如果字典里没有匹配的密码,而你知道密码的格式(比如长度8位、包含字母+数字),可以尝试掩码攻击:
hashcat -m 0 -a 3 hash_target.txt ?a?a?a?a?a?a?a?a --custom-rule '^potPlantSalt $2'
-a 3:掩码攻击模式?a:代表所有可打印字符(字母、数字、符号),你可以根据已知条件替换,比如?l?l?l?l?d?d?d?d代表4个小写字母+4个数字
重要提醒
请务必确认你对该数据库拥有合法的测试权限,未经授权的破解行为违反法律和道德规范,后果自负。
内容的提问来源于stack exchange,提问作者user11054683




