0

我最近开始研究一个项目,它包含以下散列密码的函数:

function hash_password($password) {
    $account_id = $this->account_id;

    /*
     * Cook up some randomness
     */
    $password = str_rot13($password);

    $random_chars = "1%#)(d%6^".md5($password)."&H1%#)(d%6^&HB(D{}*&$#@$@FEFWB".md5($password)."``~~+_+_O(Ed##fvdfgRG:B>";

    $salt = $account_id;
    $salt = ((int)$salt * 123456789) * 1000;

    $salt_len     = strlen($salt);

    for($i=0; $i <= $salt_len; $i++) {
        $salt .= $random_chars[$i];            
    }

    $salt = str_repeat($salt, 3);

    return hash('sha256', base64_encode($password.$salt.$password), false);
}

*$account_id 对于每个用户帐户都是唯一的。

我的问题是:这个功能是否比做一些简单的事情更安全:

$salt = sha1($account_id);
$hash = hash('sha256', base64_encode($password.$salt), false);

干杯!

4

1 回答 1

0

使用帐户 ID 作为盐可能不是一个好主意 - 如果有人可以窃取您的散列密码,那么他们可能也可以获得帐户 ID。因此,在这种情况下,如果代码也受到很好的保护,那么在代码中使用更复杂的哈希可能会更安全。使用已知的随机字符串作为代码中的盐意味着有人必须同时破解您的数据和代码才能攻击密码——这比仅仅攻击数据库要好。

于 2012-06-07T13:20:02.663 回答