Правильный способ проверить пароль в Java из базы данных SQL? - PullRequest
0 голосов
/ 08 февраля 2012

Я пытаюсь определить лучший способ реализовать проверку пароля в Java.Пароль хранится в виде текста в базе данных SQL.

Должен ли я:

  1. Запросить пароль на основе имени пользователя и проверить его в приложении Java?(ВЫБЕРИТЕ пароль ОТ ПОЛЬЗОВАТЕЛЕЙ, ГДЕ username = 'foo')
  2. Запрос строки на основе имени пользователя + ввода пароля?(ВЫБЕРИТЕ истину от пользователей, ГДЕ username = 'foo' и password = 'bar')
  3. Что-то еще полностью ...

Если ответ # 1, как правильно получить хэш пароля в Java?Я знаю, что пароли должны храниться как char [] вместо String, чтобы не оставлять копию в памяти, но можно ли извлечь ее из результирующего набора, используя ResultSet.getString ("password")?Разве это не создаст строковую константу и не станет угрозой безопасности (даже если хешируется)?Другой вариант, который я вижу, состоит в том, чтобы сохранить / преобразовать пароль в массив в SQL, а затем использовать ResultSet.getArray () для его извлечения, но это кажется немного чрезмерным, если не является абсолютно необходимым.

Редактировать:

Хорошо, возможно, я допустил ошибку, используя слово TEXT в том же сообщении, что и ПАРОЛЬ, но я имел в виду тип данных, но не говорил, что я сохраняю пароли в обычном виде.текст.На самом деле я четко спросил: «Как правильно получить пароль hash в Java».Пожалуйста, придерживайтесь вопроса, который я задал, если вы хотите помочь.

Ответы [ 3 ]

0 голосов
/ 08 февраля 2012

Оба ваших метода плохие, так как пароль передается в виде обычного текста вне приложения, возможно, по сети. Но второй метод немного лучше, так как некоторые пароли передачи иногда будут неправильными.

Используйте какое-то хеширование. Хеш пароль затем сохраните его в базе данных. Хэш также ввел пароль и сравните хэши. Хеширование - это необратимое преобразование данных. Используйте класс MessageDigest http://docs.oracle.com/javase/6/docs/api/java/security/MessageDigest.html для создания хэшей в Java. Используйте тот, который знает ваша база данных.

0 голосов
/ 08 февраля 2012

Вариант 3: совершенно другой.

Шаг 1: SELECT passwordHASH from users WHERE username=? (обратите внимание на местозаполнитель, чтобы избежать атак с использованием SQL-инъекций - проверьте, как использовать API-заполнители в вашем API)

Шаг 2: извлечь соль из хэша пароля.

Шаг 3: используйте соль для вычисления хеша из простого текста, полученного от пользователя

Шаг 4: сравните существующий PasswordHash с недавно вычисленным PasswordHash.

Серьезно : чтение хешей с посоленными паролями. Это только правильный способ хранения паролей. И самое лучшее, это уже существует. Даже не пытайтесь изобретать это колесо, если вы не гений криптографии (и тогда вы должны знать лучше).

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

0 голосов
/ 08 февраля 2012

Хеши пароли.Чем вы можете сравнить хэши.

ВЫБЕРИТЕ имя пользователя от пользователя, ГДЕ имя пользователя = username и password_hash = password_hash;

Как я могу хешировать пароль в Java?

byte[] salt = new byte[16];
random.nextBytes(salt);
KeySpec spec = new PBEKeySpec("password".toCharArray(), salt, 2048, 160);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hash = f.generateSecret(spec).getEncoded();
System.out.println("salt: " + new BigInteger(1, salt).toString(16));
System.out.println("hash: " + new BigInteger(1, hash).toString(16));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...