如何随机盐SHA512

时间:2012-08-21 14:51:03

标签: php passwords hash sha512

目前我正在使用php5来查询我的密码。我想知道如何更改SHA512的随机盐。我将以下代码从sha1更改为sha 512后,我的哈希失败。 以下是我的密码哈希码:

public function hashSSHA($password) {

    $salt = mhash(rand());
    $salt = substr($salt, 0, 15);
    $encrypted = base64_encode(bin2hex(mhash(MHASH_SHA512, $password . $salt, true) . $salt));
    $hash = array("salt" => $salt, "encrypted" => $encrypted);
    return $hash;
}

/**
 * Decrypting password
 * @param salt, password
 * returns hash string
 */
public function checkhashSSHA($salt, $password) {

    $hash = base64_encode(bin2hex(mhash(MHASH_SHA512, $password . $salt, true) . $salt));

    return $hash;
}

我设法注册了一个新用户但是当我尝试使用注册用户登录时,它会告诉我我的用户名或密码在哪里。所以我想知道我做错了什么。谢谢!

1 个答案:

答案 0 :(得分:2)

rand()每次使用时都应该有不同的值,因此当用户注册并尝试登录时,salt会有所不同。尝试为salt提供静态值,例如'例如,sdfj3209r34r4',看它是否有效。这虽然很弱,但每个人都会吃同样的盐。

另一种选择是使用对每个人都不常见但也是“静态”的东西。这意味着它与每个用户不同,但对每个用户保持不变。

后者的一个例子是使用密码的md5作为盐,用户名,用户的城市或您可用的任何数据,您知道它不会改变(如果它发生变化,请求密码并创建新的哈希,就像许多站点一样)。直到现在才回答这个问题我才意识到这一点,这可能是为什么当你改变一些'私人'信息时,为www.hotmail.com这样的地方请求密码的另一个原因,因为他们必须重建哈希。

在其他stackoverflow问题中有很多关于盐的信息。

EDIT。试试这个:

public function hashSSHA($password) {

    $salt = mhash(MHASH_SHA512, $password);
    $encrypted = base64_encode(bin2hex(mhash(MHASH_SHA512, $password . $salt, true) . $salt));
    $hash = array("salt" => $salt, "encrypted" => $encrypted);
    return $hash;
}

/**
 * Decrypting password
 * @param salt, password
 * returns hash string
 */
public function checkhashSSHA($salt, $password) {

    $hash = base64_encode(bin2hex(mhash(MHASH_SHA512, $password . $salt, true) . $salt));

    return $hash;
}

另外,你确定checkhashSSHA中的$ salt与hashSSHA完成的相同吗?因为变量通常是LOCAL(它们只在同一个函数内部工作)。这意味着您需要在函数外部使用相同的脚本$salt = mhash(MHASH_SHA512, $password);来创建salt。如果这样做,这真的是多余的,如果你不这样做,$ salt在第二个函数中没有值。请提供更多代码。