соответствие пароля пользователя из записи в дБ - PullRequest
0 голосов
/ 06 июля 2011

В моем веб-приложении, которое использует сервлеты и спящий режим. Мне нужно аутентифицировать Клиента, который вводит пароль.

Если он уже находится в базе данных, мне нужно проверить, совпадает ли его пароль с записью в db. Для нового Клиента я хочу взять пароль и создать для него запись. Я пытался сделать это таким образом для сценариев.

Существующий Клиент вводит адрес электронной почты и пароль

String email = req.getParameter("emailAddress");
String password = req.getParameter("password");
Customer cust = dao.findByEmailAddress(email);

Теперь, как мне проверить, связан ли этот объект cust с паролем и соответствует ли он введенному пользователем? Пример спящей книги Мэннинга хранит пароль в виде строки в классе Customer. Это хорошая идея? Как это будет храниться в базе данных?

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

Может кто-нибудь сказать мне, как я могу справиться с этим?

Ответы [ 3 ]

5 голосов
/ 06 июля 2011

Хранение паролей в виде простого текста никогда не является хорошей идеей. На самом деле это занесено в список угроз № 8 в списке 25 самых опасных программных ошибок .

Вам необходимо зашифровать пароли перед записью их в базу данных. При поиске пользователя используйте зашифрованный пароль

String email = req.getParameter("emailAddress");
String password = req.getParameter("password");
String encryptedPassword = MD5Helper.hashPassword(password)
Customer cust = dao.findByEmailAddressAndPassword(email, encryptedPassword);

Вы можете использовать что-то подобное для шифрования паролей с использованием алгоритма MD5.

public class MD5Helper {

    private static final int MD5_PASSWORD_LENGTH = 16;

    public static String hashPassword(String password) {
        String hashword = null;
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(password.getBytes());
            BigInteger hash = new BigInteger(1, md5.digest());
            hashword = hash.toString(MD5_PASSWORD_LENGTH);
        } catch (NoSuchAlgorithmException nsae) {
            // handle exception
        }
        return hashword;
    }
}
2 голосов
/ 06 июля 2011

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

Есть две другие возможности

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

Последняя возможность - использовать односторонний алгоритм хеширования (например, SHA-1), также известный как алгоритм дайджеста сообщений.Таким образом, нет необходимости в секретном ключе, и было бы очень трудно (читай: почти невозможно) получить доступ к паролю (если пароль соленый).Недостаток этого решения заключается в том, что если пользователь потеряет свой пароль, вы не сможете его отправить.Единственная возможность - сбросить его на новое значение, отправить этот новый пароль пользователю и попросить его выбрать новый.Аутентификация пользователя в этом случае заключается в хешировании пароля, который он отправляет, и сравнении с хешем, хранящимся в базе данных.

Для более подробных объяснений прочитайте http://en.wikipedia.org/wiki/Salt_(cryptography).

0 голосов
/ 06 июля 2011

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

String passwordEncrypted = encrypt(password);

, где encrypt - ваша функция, которая шифрует пароль (вы можете попробовать сMD5 или SHA-1, например).

После того, как вы получили свой объект cust, вы можете проверить, если

if (cust.getPassword().equals(passwordEncrypted)) {
    // login successfull code
} else {
    // login failed code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...