如何获取经password_hash()哈希处理后的原始密码?
关于bcrypt哈希密码无法还原的说明及替代方案
兄弟,先给你明确一个核心事实:你完全没办法从password_hash()生成的bcrypt哈希值中还原出原始密码。
为什么没法还原?
PASSWORD_BCRYPT采用的是bcrypt哈希算法,这类算法从设计之初就是单向不可逆的。它的作用是把原始密码通过复杂运算转换成一串无意义的字符,这个过程不存在反向解密的途径——password_verify()也不是解密,它只是把用户输入的原始密码用同样的哈希规则运算一遍,对比结果是否一致,最终返回布尔值而已。
那想在编辑密码前“确认原密码”该怎么做?
这是个常见需求,但行业标准做法绝对不是去还原哈希密码,而是换一种思路:
- 要求用户输入当前正在使用的密码,用
password_verify()验证这个输入和数据库里的哈希值是否匹配 - 验证通过后,再允许用户设置新密码
给你举个简单的代码示例:
// 从数据库取出已存储的哈希密码 $storedHash = '$2y$12$...'; // 这里是你之前用password_hash生成的哈希值 // 用户提交的当前密码和新密码 $currentPassword = $_POST['current_password']; $newPassword = $_POST['new_password']; // 验证当前密码是否正确 if (password_verify($currentPassword, $storedHash)) { // 验证通过,生成新的哈希并更新数据库 $newHash = password_hash($newPassword, PASSWORD_BCRYPT, ['cost' => 12]); // 这里写更新数据库的逻辑,把newHash存入对应字段 echo "密码修改成功!"; } else { echo "当前密码输入错误,请重试!"; }
重要提醒
绝对不要尝试把原始密码明文存储在数据库里,这会带来极大的安全风险——一旦数据库泄露,所有用户的密码都会直接暴露。bcrypt的单向哈希设计,正是为了避免这种危险情况发生。
内容的提问来源于stack exchange,提问作者gdmorning
相关产品推荐
相关产品推荐

