Я хочу проверить хэш 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.
BcryptPasswordEncoder
или аналогичный в качестве библиотеки, даже если вы не используете ничего из остального.) - person chrylis -cautiouslyoptimistic-   schedule 15.07.2020VARCHAR(255)
по умолчанию. У некоторых людей совершенно нелепые адреса электронной почты. - person tadman   schedule 15.07.2020