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

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

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

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

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

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

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

Страница вики-страницы 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); 

Обязательно «истинный» – третий параметр …