Как безопасно генерировать хэши SSHA256 или SSHA512 в PHP?

Я работаю над модулем веб-администрирования для почтовых серверов (он с открытым исходным кодом, если вы хотите посмотреть).

Для этого мне нужно иметь возможность генерировать хешированный пароль, который будет доступен для чтения Dovecot. Как описано в их вики, рекомендуемая схема хэширования паролей - SSHA256 (дополнительный S - для соли).

Также объясняется, что это может быть достаточно просто реализовать с помощью чего-то вроде этого кода PHP:

$salt = 'generate_a_salt_somehow';
$hash = hash('sha256', $password . $salt);

Тем не менее, из того, что я читал о криптографии, это довольно наивный способ генерировать соленые хэши, но если вы ошибаетесь при вводе AES в исходном коде, я подумал, что то же самое может быть и в этом случае.

Так что, если у вас есть понимание криптографии, я хотел бы услышать о наиболее безопасном способе сделать это, будь то mcrypt, mhash или что-то еще.

2 ответа

Решение

Вики-страница Dovecot, на которую вы ссылались, объясняет, какой именно формат хэша использует Dovecot. У вас нет выбора в этом вопросе - у Dovecot есть ожидания относительно того, как будет выглядеть хеш, поэтому вы должны играть по его правилам:

Для большинства схем соленых паролей (SMD5, SSHA*) соль сохраняется после хэширования пароля, и ее длина может изменяться. При хешировании пароля добавьте соль после открытого текста, например: SSHA256(проход, соль) = SHA256(проход + соль) + соль.

Таким образом, соответствующая функция генерации пароля в PHP может выглядеть так:

$hash = "{SSHA256}" . base64_encode(hash('sha256', $password . $salt) . $salt);

Функция генерации пароля в PHP:

$hash = "{SSHA256}".base64_encode(hash('sha256', $password.$salt, true).$salt);

Обязательно "правда" - третий параметр...

Другие вопросы по тегам