Я создаю таблицу для пользователей, содержащих их хэшированные пароли и ее соль.MySQL и Java: массив байтов не тот, который был получен при его сохранении
Проблема заключается в том, что когда я создаю строку пользователя в таблице и сохраняю соль и пароль (оба являются byte[]
, хранящиеся в столбцах VARBINARY
) и попытайтесь вернуть эти данные, когда пользователь зайдет назад, возвращенная соль и hashed пароль отличается от того, когда я создал строку.
Чтобы получить данные, я использую ResultSet
и я называю resultSet.getBytes("password")
Для создания строки я использую запрос, как это (удалены другие данные столбцов, чтобы сделать его проще):
String query = String.format("insert into users (`password`, `salt`) values ('%s','%s');", user.getHashedPassword(), user.getSalt());
Может там быть какой-то конверсией или что-то, что происходит, что вызывает эту проблему? Должен ли я использовать что-то кроме VARBINARY
для хранения byte[]
?
Хорошо, это похоже на то, что мне нужно. Кроме того, что вы предложите для предотвращения инъекций. Будет ли хватать escape-символов? – vedi0boy
@ vedi0boy: Нет, вы используете 'PreparedStatement' с параметризованным SQL, как я сказал в ответе. Когда значения параметров задаются отдельно от SQL, им не требуется экранирование. –
Прошу прощения, это не то, что я прошу. Я не спрашиваю, нужно ли мне добавлять escape-символы. Я спрашиваю, нужно ли мне удалить их. Я исследовал инъекции SQL, и одной из самых больших угроз являются хакеры, использующие escape-символы, чтобы избежать записи в String, например имя пользователя, и сами изменить запрос. Я спрашиваю, достаточно ли использовать 'str.replaceAll (" \ "," ")'. – vedi0boy