Хешированная строка Sha1, правильно закодированная в mysql, но отображаемая по-другому в виде строки Java

В настоящее время я разрабатываю Java-программу в сочетании с базой данных MySQL, используя шаблон Дао. У меня есть некоторая информация о пользователе, которая будет храниться в таблице, и я храню хешированную версию исходной строки пароля Sha1. Я использую apache.commons.codec.digest.DigestUtils для этого. Строка, отображаемая в php-mysql, идеально подходит, но когда я пытаюсь отобразить ту же строку в тестовой программе Java, у меня совершенно другой результат.

Вот мой конструктор для пользовательского объекта:

public User(int id, String name, String firstName, String email, String login, String password)
    {
        super(id, name, firstName); 
        this.email = email;
        this.login = login;
        //Convert the password to SHA1 before storing it in the object
        //using Apache commons-codec-1.9 lib
        this.hashedPassword = DigestUtils.sha1Hex(password);
    }

Так, например, при создании пользователя с "aff" в качестве пароля,

User user1 = new User(1, "Durand", "Jack", "jack.durand@mymail.com", "jack", "aff"); 

Я получаю "0c05aa56405c447e6678b7f3127febde5c3a9238" в mysql, который выглядит правильно, и так же, как вывод онлайн-хэшей sha1.

Но при чтении данных обратно в объект и отображении их с помощью Sysout(User.getPassword()) в Java, я получаю "c14b77e8930a8bfd884c8917f2b7335501a39dde", что, очевидно, не то же самое.

Есть идеи, что это вызывает? Я читал несколько предыдущих сообщений о проблеме с Byte[], но говорят, что метод DigestUtils.sha1Hex(пароль) возвращает простую строку. Так чего мне не хватает?

1 ответ

Решение

Все, что вы сделали, правильно.

"0c05aa56405c447e6678b7f3127febde5c3a9238" является правильным выводом.

Я подозреваю, что MySQL обновляется между чтениями.

Мое предложение будет, проверьте, действительно ли значение "0c05aa56405c447e6678b7f3127febde5c3a9238" на самом деле сохраняется в MySQL. Разбейте верстак и откройте строку, чтобы проверить ее значение.

Если значение в MySQL является правильным, то оно находится в преобразовании из RDBMS -> Java. Если вы определили пароль атрибута как String, то Hibernate (или что вы используете) должен оставить поле как есть.

Другие вопросы по тегам