Проверка SHA2 в MySQL с использованием подготовленных операторов. Обновлено: лучший способ сохранить пароль в mysql для безопасного веб-приложения с системой входа.

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

CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(150) UNIQUE NOT NULL,
    role TINYINT NOT NULL,
    salt VARCHAR(255) NOT NULL,
    hash VARCHAR(255) NOT NULL
);

Мои операторы вставки для пользователей:

INSERT INTO users(email, role, salt, hash) 
VALUES ('[email protected]', '0', 'salt' ,SHA2(CONCAT ('partOne', 'partTwo', 'salt',), 224), '1'),

Значение, которое должно сверяться с сохраненным хэшем, исходит из двух параметров, заданных в сервлете (называемых partOne и partTwo), и соли, которая хранится отдельно для каждой записи (соли столбца). Я попытался сделать это с помощью следующего подготовленного оператора MySQL в сервлете:

PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE hash = SHA2(CONCAT (?, ?, salt), 224)");
ps.setString(1, partOne);
ps.setString(2, partTwo);

Однако это не работает (ошибок нет, но записи не возвращаются). Итак, мой вопрос: могу ли я включить что-то, что я выбираю (например, соль в SHA2, или мне нужно сначала выполнить оператор, в котором я выбираю соль для этого пользователя, а затем передать ее через «?» как другие переменные? Я подумал, что это будет нормально, поскольку условие также включает столбец «хэш», поэтому я не вижу в этом проблемы Или в моем синтаксисе для подготовленных операторов есть какая-то ошибка?

Обновлять:

Из комментариев я понимаю, что это плохой план. Итак, мой вопрос: как лучше всего безопасно хранить что-то вроде пароля для системы входа/выхода пользователя для защиты веб-приложения? Идея, которую я пробовал, пришла из этого post.


person Alistair Leslie Graham    schedule 15.07.2020    source источник
comment
Использование хэшей SHA2 для паролей — крайне плохой план. Это новая система или какая-то устаревшая?   -  person tadman    schedule 15.07.2020
comment
Мало того, что здесь используется действительно слабый хеш, SHA2 предназначен для высокой скорости, а не устойчивости к грубому форсированию, но эта реализация требует тестирования каждого пользователя в вашей базе данных на предмет возможного совпадения. Если у вас есть нетривиальное количество пользователей, это будет серьезно нарушать ваш сервер базы данных, и это будет легко превратить в атаку типа «отказ в обслуживании», поскольку попытка ввода пароля будет иметь огромные расходы на стороне сервера. Вы должны тестировать одного пользователя и только одного пользователя only.   -  person tadman    schedule 15.07.2020
comment
(1) Не изобретайте протоколы безопасности. (2) Не внедряйте протоколы безопасности. Есть более простые способы сделать это, которые значительно более безопасны; Пожалуйста, предоставьте подробную информацию о вашем случае использования. (Как минимум, вы должны использовать Spring Security BcryptPasswordEncoder или аналогичный в качестве библиотеки, даже если вы не используете ничего из остального.)   -  person chrylis -cautiouslyoptimistic-    schedule 15.07.2020
comment
Еще одно: сделайте поля адреса электронной почты VARCHAR(255) по умолчанию. У некоторых людей совершенно нелепые адреса электронной почты.   -  person tadman    schedule 15.07.2020
comment
Спасибо за все советы! Это просто то, что я разрабатываю, чтобы узнать больше о дизайне MySQL и БД! Я хочу использовать хэш, который хранится в качестве пароля для пользователя, и я использовал эти сообщения ответ чтобы прийти к этой идее, которую я разместил в своем вопросе. Я посмотрю на BcryptPasswordEncoder, спасибо за совет! Не могли бы вы указать мне направление некоторых полезных ссылок? Я никогда не использовал BcryptPasswordEncoder.   -  person Alistair Leslie Graham    schedule 15.07.2020
comment
если есть что-то, что было бы еще лучше использовать, хотелось бы услышать это! как уже упоминалось, это то, что я разрабатываю, чтобы узнать для себя, как делать определенные вещи и что такое хорошая практика! ваше здоровье!!   -  person Alistair Leslie Graham    schedule 15.07.2020
comment
Если вы изучаете дизайн БД, это прекрасно, но главное в отношении паролей — хранить их с использованием соответствующего хэша для конкретного пароля, такого как BCrypt. Документация этого кодировщика находится на расстоянии поиска. Если вы храните пользовательские данные, вы несете огромную ответственность за то, чтобы сделать это правильно, чтобы в случае утечки вашей базы данных по какой-либо причине это не было тривиально для взламывайте пароли и превращайте свою базу данных в оружие.   -  person tadman    schedule 15.07.2020
comment
ок, еще раз спасибо! Я читаю об использовании spring-boot и весенней безопасности   -  person Alistair Leslie Graham    schedule 15.07.2020
comment
поскольку мой подход недействителен, должен ли я удалить этот вопрос? или вы думаете, что это может быть полезно для других?   -  person Alistair Leslie Graham    schedule 16.07.2020