Я заставляю php войти в систему, и я пытаюсь решить, использовать ли SHA1 или Md5 или SHA256, о котором я читал в другой stackoverflow статье. Действительно ли какой-либо из них более безопасен, чем другие? Для SHA1/256 я все еще использую соль?
Кроме того, действительно ли это - безопасный способ сохранить пароль как хеш в mysql?
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = sha1($salt . $hash);
Neither. Вы должны использовать bcrypt
. Все упомянутые вами хэши оптимизированы для быстрой и легкой работы на аппаратном обеспечении, и поэтому их взлом обладает теми же качествами. Если у вас нет другого выбора, по крайней мере, обязательно используйте длинную соль и многократное повторение хэша.
PHP 5.5 предлагает новые функции для хэширования паролей. Это рекомендуемый подход для хранения паролей в современных веб-приложениях.
// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// If you omit the ['cost' => 12] part, it will default to 10
// Verifying the password against the stored hash
if (password_verify($password, $hash)) {
// Success! Log the user in here.
}
Если вы используете более старую версию PHP, вам действительно следует обновиться, но пока вы этого не сделали, вы можете использовать password_compat для использования этого API.
Также, пожалуйста, позвольте password_hash()
генерировать соль для вас. Он использует [CSPRNG](http://
NUL
символов. (Доказательство концепции для обеих оговорок здесь.)
У вас может возникнуть соблазн решить первую оговорку путем предварительного хэширования паролей перед тем, как пропустить их через bcrypt, но это может привести к тому, что ваше приложение столкнется со второй.
Вместо того чтобы писать собственную схему, используйте существующую библиотеку, написанную и/или оцененную экспертами по безопасности.
Zend\Crypt
(часть Zend Framework) предлагает BcryptSha
PasswordLock
похож на BcryptSha
, но он также шифрует хэши bcrypt с помощью аутентифицированной библиотеки шифрования. TL;DR - Используйте bcrypt.
Используйте SHA256
. Это не идеально, так как SHA512
был бы идеальным для быстрого хеширования, но из возможных вариантов это определенный выбор. Как и в случае с любой технологией хеширования, не забудьте солить хеш для дополнительной безопасности.
В качестве дополнительного примечания, FRKT, пожалуйста, покажите мне, где кто-то может легко взломать соленый хеш SHA256? Мне действительно очень интересно это увидеть.
В дальнейшем используйте bcrypt
в качестве усиленного хэша. Более подробную информацию можно найти здесь .
Редактировать при солении:
Используйте случайное число или случайный поток байтов и т. Д. Вы также можете использовать уникальное поле записи в своей базе данных в качестве соли, таким образом соль будет разной для каждого пользователя.