目前我正在使用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;
}
我设法注册了一个新用户但是当我尝试使用注册用户登录时,它会告诉我我的用户名或密码在哪里。所以我想知道我做错了什么。谢谢!
答案 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在第二个函数中没有值。请提供更多代码。