繁体   English   中英

如何重新哈希存储在我的数据库中的密码? (PHP)

[英]How to ReHash a password stored into my Database ? (PHP)

我的数据库中已加密了一些密码,我想找到一种显示密码的方法。 这是它们如何保存到我的mysql数据库中的方法:

function generateHash($plainText, $salt = null){

                if ($salt === null)
  {
   $salt = substr(md5(uniqid(rand(), true)), 0, 25);
  }
  else
  {
   $salt = substr($salt, 0, 25);
  }

  return $salt . sha1($salt . $plainText);
 }

        $secure_pass = generateHash($this->clean_password);

然后$ secure_pass保存到我的数据库中。

任何人都会有一个主意?

非常感谢你 ;)

您绝不能显示密码。
您绝不能显示密码。
您绝不能显示密码。

散列密码的全部目的是使此操作变得不可能。

由于您使用的是某种不安全的哈希,因此不太可能,但仍然无法做到。

您应该使用SHA512而不是SHA1来使此操作变得更不可能。

密码哈希的要点是它不可能逆向操作。 因此,基本上,这里的答案是否定的,你不能。

有无数个会产生任何哈希值的值,因此无法确定地复制给出的原始密码。

但是,您可以通过以下方法之一显示工作密码:

Cavet:显然,如果安全性对您很重要,则您不应执行上述任何一项操作。 如果您想允许忘记密码的用户,建议您阅读有关密码重置的信息。

你不能反向推散列函数...留下了两个选择:

1强制用户插入新密码或...

2在用户再次登录到系统时更新哈希(您可以强制执行cookie和允许用户登录而无需重新输入密码的会话)。 该解决方案将允许您的用户使用旧哈希来登录,同时您将旧哈希更新为新哈希。 下次您的用户登录时,脚本将使用新版本的hash来登录用户。

在此示例中,我将md5用作哈希,我想使用cost = 12更新到BCRYPT,但可以随时将其更改为所需的值。 从BCRYPT成本= 10更改为BCRYPT成本= 12也可以,也可以是任何其他组合。 考虑以下示例:

$passwordFromDatabase = "0d107d09f5bbe40cade3de5c71e9e9b7"; // md5  hash of "letmein"
$passwordFromForm = $_POST['password']; // $_POST['password'] == "letmein"

if(password_needs_rehash($passwordFromDatabase, PASSWORD_BCRYPT, ["cost" => 12]) && md5($passwordFromForm) === $passwordFromDatabase){
    // generate new password
    $newPasswordHash = password_hash($passwordFromForm, PASSWORD_BCRYPT, ["cost" => 12]);
    // update hash from databse - replace old hash $passwordFromDatabase with new hash $newPasswordHash
    // after update login user
    if(password_veryfi($passwordFromForm, $newPasswordHash)){
        // user has loged in successfuly and hash was updated
        // redirect to user area
    }else{
        // ups something went wrong Exception
    }
}else{
    if($password_veryfi($passwordFromForm, $passwordFromDatabase)){
        // user password hash from database is already BCRYPTed no need to rehash
        // user has loged in successfuly
        // redirect to user area
    }else{
        // wrong password
        // no access granted - stay where you are
    }
}

我更喜欢第二种选择:)。 自行选择。 如果您选择第二个选项,并且选择不踢出允许用户在不提供密码的情况下登录的cookie和会话,那也可以...更改将随着时间的流逝而发生。 而且没有人会注意到这一变化。

您已经通过SHA1运行了它们-原始密码已被破坏,并且无法通过任何实际方法恢复。 您可以尝试查找另一个产生相同SHA1的字符串,但这要花很多功夫。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM