PHP SHA1 дает другой результат, чем ожидалось - PullRequest
0 голосов
/ 25 августа 2011

Это действительно удивляет меня - это должно быть довольно просто, но я не могу понять, в чем разница.

У меня есть эта функция для генерации соли:

private function _generateSalt($max = 128)
{
    $characterList = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#¤%&/()~";
    $i = 0;
    $salt = "";
    do {
        $salt .= $characterList{mt_rand(0,strlen($characterList)-1)};
         $i++;
    } while ($i < $max);
    return $salt;
}

Довольно простой (?)

И попытка создать хеш SHA1 из этого дает мне другой результат, чего я и ожидал:

$salt = $this->_generateSalt();
$password = $salt.$password;
echo sha1($password);

$ пароль - строка, сгенерированная пользовательским вводом.Отраженная хэшированная строка неверна.И я не знаю, почему.

var_dump($password); после добавления соли дает мне ожидаемый размер строки - скопируйте и вставьте результат в онлайн-сервис SHA1 или хеширование строки через CLI MySQL даст правильный результат.Как будто есть что-то невидимое в переменной $ password, которую я не хочу хэшировать.Но как я могу узнать, почему это происходит?var_dump (), trim () и сравнение результатов никуда меня не привели?

Ответы [ 3 ]

0 голосов
/ 25 августа 2011

Не должна ли эта строка: $salt .= $characterList{mt_rand(0,strlen($characterList)-1)};

Выглядит так: $salt .= $characterList[mt_rand(0,strlen($characterList)-1)];

0 голосов
/ 25 августа 2011

Избавьтесь от всех не алфавитно-цифровых спецсимволов - это даже не ASCII, насколько я могу судить: ¤.Так что это может испортить ситуацию, если вы запустите sha1 под строкой, закодированной в разных кодировках.

(Этот ответ скопирован из комментариев и добавлен в качестве ответа из-за запроса аскера, так как кажется, что он решает проблему)

0 голосов
/ 25 августа 2011

Лучший способ получения соли:

// True for cryptographically strong, FALSE otherwise
$salt_strong = TRUE;

// The length
$salt_length = 32;

// Create the salt and load the results into a local var
$salt = bin2hex( openssl_random_pseudo_bytes( $salt_length , $salt_strong ) );
...