1

目前我使用 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;
}

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

4

1 回答 1

2

rand()应该在每次使用时具有不同的值,因此当用户注册和尝试登录时,盐值是不同的。尝试给盐值一个静态值,例如'sdfj3209r34r4',看看它是否有效。这很弱,因为每个人都会有相同的盐。

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

后者的一个示例是使用密码的 md5 作为 salt、用户名、用户所在的城市或任何您知道它不会更改的可用数据(如果更改,请请求密码和像许多网站一样创建新的哈希值)。直到现在回答这个问题我才意识到这一点,这可能是 www.hotmail.com 等地方在您更改某些“私人”信息时要求输入密码的另一个原因,因为他们必须重建哈希。

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

编辑。尝试这个:

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 所做的相同吗?因为变量通常是本地的(它们只在同一个函数内工作)。这意味着您需要$salt = mhash(MHASH_SHA512, $password);在函数外部具有相同的脚本来创建盐。如果你这样做,这真的是多余的,如果你不这样做, $salt 在第二个函数中没有任何价值。请提供更多代码。

于 2012-08-21T15:09:43.040 回答