Хеши md5 в Java от MessageDigest не совпадают - PullRequest
1 голос
/ 01 апреля 2012

У меня есть объект с именем users, который я использую для хранения пользовательских объектов, имеющих учетную информацию.

Я вызываю этот код, чтобы сделать нового пользователя по умолчанию.

user def = new user("admin","admin",md5hash(("osa").toCharArray()),1,-1);

Этот пользователь def добавлен в массив.

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

System.out.println(userarray.get(x).username);
System.out.println((userarray.get(x).password).toString());

Все пароли зашифрованы в md5 и хранятся в виде байтового массива с использованием этого кода:

byte[] md5hash(char[] passwd) {
    String passwdtext = new String(passwd);
byte[] passdigest = null;
    try {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.reset();
        md5.update(passwdtext.getBytes("UTF-8"));
        passdigest = md5.digest();

    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return passdigest;
}

Когда я пытаюсь ввести «admin» для пользователя и «osa» для пароля, я также выводю их и сравниваю со значениями в массиве

Я получаю следующее:

admin [B@2b12e7f7

и сравните со значением внутри массива: admin [B @ 663b1f38

Почему они разные?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Массив байтов toString () не кодирует данные.То, на что вы смотрите, является адресом памяти указанных массивов.«[B» означает байтовый массив.Гекс после этого является адресом.

Вместо этого вы должны вызвать Arrays.toString(digestArray);, который будет печатать фактические значения в массиве.

Кроме того, это не ясно из кода, который вы опубликовали, но если вы пытаетесь использовать== для сравнения двух массивов, которые потерпят неудачу по той же причине.Оператор == для массивов сравнивает адреса памяти.Здесь снова, вы должны использовать Arrays.equals(a1, a2) для сравнения.

1 голос
/ 01 апреля 2012

Вы звоните toString() на byte[], который просто звонит Object.toString(). То, что вы получаете, не представляет содержимое массива, а вместо этого hashCode .

Если вы хотите получить строку MD5, я бы предложил использовать DigestUtils.md5Hex() из проекта Apache Commons Codec . Это заменяет весь ваш метод md5hash().

Если вы не заинтересованы в добавлении внешней зависимости и просто хотите реализовать это для себя, тогда вам просто нужно декодировать строковое представление для каждого байтового значения в вашем байтовом массиве, например, Arrays.toString().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...