Кажется, что столбец пароля вашей базы данных - это тип, обозначенный как String
в Java (varchar
, наиболее вероятно). Таким образом, Hibernate не может преобразовать ваш байт array
в String
.
Вы можете изменить свои строки на что-то вроде:
String digest = new String(md.digest());
String query = "SELECT L FROM Login AS L WHERE L.email=? AND L.password=?";
Object[] parameters = { login.getEmail(), digest };
Но, вероятно, это не сработает, поскольку дайджест, скорее всего, будет содержать байты, не отображаемые в символы независимо от кодировки. Вероятно, вам следует использовать кодировку base64 , чтобы отобразить двоичный двоичный объект в строку.
Другое решение будет состоять в том, чтобы изменить схему базы данных и сделать поле password
двоичным, а не varchar
.
В обоих случаях вам нужно знать, как поле password
вставляется в базу данных.
Некоторые замечания по вашему коду:
Мне кажется странным, что вы проверяете пароль, выбирая строку из вашей базы данных с именем пользователя и паролем. Хотя было бы логичнее выбрать, используя только пользователя, а затем проверить предоставленный пароль по сравнению с паролем, возвращенным в базе данных.
Вы используете хеш-функцию, чтобы гарантировать, что ваш пароль не будет сохранен в виде обычного текста в базе данных. Это хорошо. Однако ваша схема имеет большой недостаток: если несколько пользователей имеют один и тот же пароль, то хешированный пароль будет одинаковым в базе данных. Так что, если у вас есть доступ к базе данных и вы знаете пароль одного пользователя, вам будет очень легко найти всех пользователей, разделяющих этот пароль. Чтобы создать что-то более безопасное, вы должны использовать схему кодирования пароля, которая включает в себя salt .