【问题标题】:How to random salt for SHA512如何为 SHA512 随机加盐
【发布时间】:2012-08-16 22:59:09
【问题描述】:

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

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

【问题讨论】:

  • 不要使用 SHA 哈希密码;太快了。
  • 我同意@SLaks。阅读这篇非常有趣的帖子:stackoverflow.com/questions/4795385/…。如果你不改变对 sha521 的看法,你仍然可以使用BCryptgetRandomBytes($count) 方法。
  • 如果我使用 BCrypt 那么我如何将它集成到我的代码中?我是加密新手。
  • @user1477388:太快意味着攻击者每秒可以尝试许多个密码。

标签: php passwords hash sha512


【解决方案1】:

rand() 应该在每次使用时都有不同的值,所以当用户注册和尝试登录时,salt 是不同的。尝试给 salt 一个静态值,比如 '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 在第二个函数中没有任何价值。请提供更多代码。

【讨论】:

  • 显然不行,从mhash()可以看出它至少需要2个参数。
  • 请问如何随机获取sha512?我知道 sha1 是 sha1(rand());
  • Ofc,你可以问任何你想要的,这就是为什么我们都在这里(;不应该是mhash(MHASH_SHA512, rand() );吗?虽然不是100%肯定。
  • 将其放入我的php后,我可以注册,但由于密码错误,我的登录失败
  • 是的,我知道,这就是我在主要答案中所说的......我用一些应该可以工作的代码来改变它。
猜你喜欢
  • 2012-11-18
  • 2017-12-08
  • 2016-07-08
  • 2018-11-09
  • 2015-10-13
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多