2016-06-10 2 views
0

Я создаю таблицу для пользователей, содержащих их хэшированные пароли и ее соль.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[]?

ответ

1

Может ли быть какое-то преобразование или что-то, что происходит, что вызывает эту проблему?

Да. Вы в основном вызываете toString() на массив байтов. Это не будет делать то, что вы хотите. Вы посмотрели на SQL, который вы выполняли?

Более того, вы все равно не должны генерировать SQL-строку, как это в любом случае - это подход, который уязвим для SQL Injection Attacks, а также для проблем с преобразованием.

Вместо этого используйте PreparedStatement с параметризованным SQL и непосредственно укажите значения параметров (PreparedStatement.setBytes и т. Д.).

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

+0

Хорошо, это похоже на то, что мне нужно. Кроме того, что вы предложите для предотвращения инъекций. Будет ли хватать escape-символов? – vedi0boy

+0

@ vedi0boy: Нет, вы используете 'PreparedStatement' с параметризованным SQL, как я сказал в ответе. Когда значения параметров задаются отдельно от SQL, им не требуется экранирование. –

+0

Прошу прощения, это не то, что я прошу. Я не спрашиваю, нужно ли мне добавлять escape-символы. Я спрашиваю, нужно ли мне удалить их. Я исследовал инъекции SQL, и одной из самых больших угроз являются хакеры, использующие escape-символы, чтобы избежать записи в String, например имя пользователя, и сами изменить запрос. Я спрашиваю, достаточно ли использовать 'str.replaceAll (" \ "," ")'. – vedi0boy

 Смежные вопросы

  • Нет связанных вопросов^_^