Функция hash () в MySQL версии 8.0

Я пытаюсь сохранить пароли в своей таблице пользователей. Конечно, я хочу их посолить и перемешать.

Но в mysql больше нет метода hash (). Как это сделать в версии 8.0? Есть ли альтернативы?

Заранее спасибо за помощь.

ПРЕДУПРЕЖДЕНИЕ: Написать свой собственный уровень контроля доступа непросто, и есть много возможностей сделать это совершенно неправильно. Пожалуйста, не пишите свою собственную систему аутентификации, если любой современный рамки разработки, такой как Laravel, имеет встроенный надежный система аутентификации. По крайней мере, следуйте рекомендуемые лучшие практики безопасности и никогда не храните пароли в виде простого текста или слабому хешу, например SHA1 или MD5.
tadman 17.09.2018 23:53

Пожалуйста, включите сообщение об ошибке точный, а не какое-то его приближение. MySQL не имеет общей функции HASH(). Вы можете спутать его с HASH() метод разметки.

tadman 17.09.2018 23:53

И в дополнение к отсутствию функции hash, MySQL 8.0.11+ также не имеет функции пароль().

Solarflare 17.09.2018 23:56
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
1 878
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны хэшировать пароли в своем приложении, прежде чем отправлять их в SQL.

Почему я это говорю? В конце концов, вы могли это сделать:

INSERT INTO Accounts (user, salt, password) 
VALUES ('myuser', '1234', SHA2(CONCAT('xyzzy', '1234'), 256))

Но теперь пароль «xyzzy» отображается в виде обычного текста в журналах запросов и двоичных журналах, даже если он хранится в хешированной форме в самой таблице. Если вы не защитите свои журналы должным образом, хакер может завладеть ими и найти пароль каждого.

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

INSERT INTO Accounts (user, salt, password) 
VALUES ('myuser', '1234', 'd3822b5f03ad0c1a363d874238f6b48fd68a131cc35d5e55c77a81db1d266b84')

Таким образом, пароль в виде обычного текста не регистрируется.

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

SELECT salt FROM Accounts WHERE user = ?

...calculate hash string using user input + salt...

SELECT password = ? AS password_matches FROM Accounts WHERE user = ?

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