已知明文密码与盐值,能否确定所使用的哈希算法?
如何确定系统使用的密码哈希算法?
你完全可以通过已知的明文密码、对应salt和hash值来确定系统采用的哈希算法,具体方法如下:
核心逻辑
已知明文密码、关联的salt和最终hash值,只需模拟常见加盐哈希算法的计算流程,对比计算结果与数据库中的hash是否一致即可验证。
具体操作步骤
- 先明确salt与密码的拼接规则:常见的组合方式有两种——
明文密码 + salt或salt + 明文密码,部分算法会带固定前缀(比如bcrypt的$2a$),但你的hash字段是varchar(64),先从无前缀的主流算法入手。 - 锁定符合64位哈希长度的候选算法:
- SHA-256:输出固定64个十六进制字符(对应256位哈希值)
- PBKDF2-HMAC-SHA256:若取256位输出,也会是64个十六进制字符,这类算法需注意迭代次数参数
- HMAC-SHA256:将salt作为密钥,输出同样是64个十六进制字符
- 用代码模拟计算验证(以Python为例):
import hashlib # 替换为你掌握的实际值 plain_pwd = "已知的明文密码" target_salt = "数据库中对应用户的salt" db_hash = "数据库中对应用户的password-hash" # 尝试拼接方式1:明文密码 + salt calc_hash1 = hashlib.sha256((plain_pwd + target_salt).encode()).hexdigest() # 尝试拼接方式2:salt + 明文密码 calc_hash2 = hashlib.sha256((target_salt + plain_pwd).encode()).hexdigest() # 尝试PBKDF2-HMAC-SHA256(常见迭代次数:1000、10000,可多试几个) calc_hash3 = hashlib.pbkdf2_hmac('sha256', plain_pwd.encode(), target_salt.encode(), 1000).hex() if calc_hash1 == db_hash: print("使用的是SHA-256,拼接规则:明文+盐") elif calc_hash2 == db_hash: print("使用的是SHA-256,拼接规则:盐+明文") elif calc_hash3 == db_hash: print("使用的是PBKDF2-HMAC-SHA256,迭代次数1000") # 可继续扩展其他算法或参数的验证 - 特殊情况排查:如果以上尝试不匹配,要考虑编码差异(比如系统用GBK而非UTF-8)、密码是否有额外预处理(如转大小写)、salt是否包含隐藏空格等细节。
补充说明
如果hash值带有类似$1$(MD5-CRYPT)、$2a$(bcrypt)的前缀,也可以直接对应到特定算法——不过bcrypt的哈希长度通常是60位左右,你的字段是varchar(64),也可以排查这类可能性。
内容的提问来源于stack exchange,提问作者Markus Seizinger
相关产品推荐
相关产品推荐

