Вас может заинтересовать просмотр этого поста о плюсах и минусах "двойного хеширования" пароля и этого FAQ по хешированию пароля .
Хеширование с помощью некоторого алгоритма al
пароля и повторное хеширование с помощью алгоритма al
, результат хеширования, скорее всего, уменьшит энтропию пароля. Это означает, что разные пароли могут давать один и тот же хэш при обработке hash_password($password)
.
Вместо того, чтобы реализовывать свои собственные функции хеширования, вы должны по возможности использовать API собственных паролей (начиная с PHP 5.5 и далее). Его ключевая функция, password_hash
, генерирует сильную соль для использования с хешем и защищена от большинства атак методом "грубой силы".
РЕДАКТИРОВАТЬ: вы, возможно, захотите придать больше энтропии (= случайности) вашим хешированным паролям, вычислив значение SHA-512 для пароля + случайную соль, а затем password_hash
, используя этот хеш. Окончательный код PHP будет выглядеть так:
function generateSalt() {
// Cryptographically secure function to generate strings
return random_bytes(64 /* use 64 bytes */);
}
/**
* Generates a strong SHA-512 hash, for use by passwordSecureHash()
* @param string $password the plain-text password
* @param string $salt the salt to generate the hash, to be kept at ALL COSTS - this function will not do it for you!
* @return string the computed hash.
*/
function sha512(string $password, string $salt) {
return hash('sha512', $password . $salt);
}
/**
* Returns the final, secure password hash for storage in database server.
* @param string $hash the SHA-512 resulting from the sha512() call.
* @return string the hashed password.
*/
function passwordSecureHash(string $hash) {
if(strlen($hash) !== 128) {
// Ensure the SHA-512 hash has 128 characters
return FALSE;
}
// Always let PHP generate the final password salt for you
return password_hash($hash);
}