使用Apache Shiro生成加盐哈希密码后能否恢复原始明文密码?
结论
你生成的加盐哈希密码无法通过技术手段直接逆向还原出原始明文密码,只有极低概率可以通过暴力枚举的方式匹配到弱密码的明文,没有通用的恢复方法。
具体原因说明
- 你使用的SHA-256属于标准密码学单向哈希函数,核心特性就是不可逆:相同输入一定会得到相同的输出,但不存在逆运算可以从输出结果反向推导输入,目前没有公开的可商用的SHA-256逆向漏洞。
- 你的实现额外做了两层安全强化,进一步提升了破解难度:
- 采用
SecureRandomNumberGenerator生成每个用户独立的随机盐,避免了彩虹表批量破解的风险 - 执行了1024次迭代哈希,暴力破解的算力成本会直接提升1024倍
- 采用
仅有的理论可行尝试路径
如果你同时拿到了目标用户的哈希密文和对应用户存储的salt值,可以尝试暴力/字典攻击匹配明文,操作逻辑如下:
- 准备明文密码字典(或是用程序遍历所有可能的明文组合)
- 对每个候选明文,执行和你生成密码完全相同的逻辑:
// candidatePlainText 是待尝试的明文,targetSalt 是对应用户存储的盐 String candidateHash = new Sha256Hash(candidatePlainText, targetSalt, 1024).toBase64();
- 把计算得到的
candidateHash和目标密文对比,如果完全一致,那么对应的candidatePlainText就是原始明文。
这种方法的实际可用性极低:
- 如果原始密码是长度超过8位、包含多类字符的强密码,民用算力需要数年甚至数百年才能枚举完成
- 只有原始密码是弱密码(比如常见的123456、简单组合、常用单词)时,才有可能通过常用字典快速匹配到
业务场景建议
如果是处理用户忘记密码的需求,不要尝试恢复原始密码,直接走重置密码流程给用户设置新密码即可,这是所有正规Web系统的标准处理方案。
内容的提问来源于stack exchange,提问作者afterbit
相关产品推荐
相关产品推荐

