Подтвердить пароль для хэш-файла SSHA256 в PHP

Для аутентификации с помощью Dovecot я использую хэши SSHA256, но я не знаю, как проверить данный пароль на существующий хеш. Следующие функции PHP (найденные в сети) используются для создания хэша SSHA256:

function ssha256($pw) { $salt = make_salt(); return "{SSHA256}" . base64_encode( hash('sha256', $pw . $salt, true ) . $salt ); } function make_salt() { $len = 4; $bytes = array(); for ($i = 0; $i < $len; $i++ ) { $bytes[] = rand(1,255); } $salt_str = ''; foreach ($bytes as $b) { $salt_str .= pack('C', $b); } return $salt_str; } 

Пример вывода: {SSHA256}lGq49JTKmBC49AUrk7wLyQVmeZ7cGl/V13A9QbY4RVKchckL

Нужно ли мне извлекать соль, но как? Я полностью потерял путь для решения проблемы, есть ли для этого намек?

Спасибо всем за помощь!

О, и извините, я должен использовать SSHA256, потому что Dovecot 1.2.15 поддерживает только те схемы: CRYPT MD5 MD5-CRYPT SHA SHA1 SHA256 SMD5 SSHA SSHA256 PLAIN CLEARTEXT CRAM-MD5 HMAC-MD5 DIGEST-MD5 PLAIN-MD4 PLAIN-MD5 LDAP-MD5 LANMAN NTLM OTP SKEY RPA

Solutions Collecting From Web of "Подтвердить пароль для хэш-файла SSHA256 в PHP"

Вы не должны использовать семейство SHA для хэширования паролей. Они быстрые и предназначены для хэширования файлов со скоростью . Вам нужно, чтобы хеширование пашков было дорогостоящим . Используйте bcrypt, PHPass или просто используйте этот класс, который я катался самостоятельно (но только пока вы не научитесь выбирать дыры в нем):

 class PassHash { public static function rand_str($length) { $total = $length % 2; $output = ""; if ($total !== 0) { $count = floor($length / 2); $output .= "."; } else $count = $length / 2; $bytes = openssl_random_pseudo_bytes($count); $output .= bin2hex($bytes); // warning: prepending with a dot if the length is odd. // this can be very dangerous. no clue why you'd want your // bcrypt salt to do this, but /shrug return $output; } // 2y is an exploit fix, and an improvement over 2a. Only available in 5.4.0+ public static function hash($input) { return crypt($input, "$2y$13$" . self::rand_str(22)); } // legacy support, add exception handling and fall back to <= 5.3.0 public static function hash_weak($input) { return crypt($input, "$2a$13$" . self::rand_str(22)); } public static function compare($input, $hash) { return (crypt($input, $hash) === $hash); } } 

Вы должны хэшировать приведенный текст и сравнивать этот хэш против того, который вы сохранили. Соли хранятся в хешах и должны быть случайными. Если хотите, добавьте перец. Вы также должны внести переменную workrate, чтобы вы могли изменить рабочую скорость в любой момент, когда это необходимо, и по-прежнему работать в вашей системе.


Если, как вы говорите, у вас нет способа реализовать это, вы можете распаковать хэш следующим образом:

 function unpack_hash($hash) { $hash = base64_decode($hash); $split = str_split($hash, 64); return array("salt" => $split[1], "hash" => $split[0]); 

Это связано с тем, что SHA256 имеет 256 бит или 64 шестнадцатеричных символа. Вы всегда можете предположить, что первые 64 символа – это хэш

Вам необходимо сохранить соль вместе с хешей.

Когда вам нужно подтвердить пароль, вы просто пересчитываете хэш снова с помощью пароля ввода пользователя + сохраненной соли. Если хеши совпадают, пользователь вводит правильный пароль.

Для вашего формата сначала используйте base64_decode , последние 4 байта результата будут солью.