Я сталкиваюсь с какой-то странной проблемой, которая связана с MD5-хэшами в Java и php5. Я понял, что при определенных обстоятельствах следующий код не генерирует правильные хеши MD5:
public static String getMD5Hash(String string) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(string.getBytes()); byte[] digest = md5.digest(); string = byteArrToHexString(digest); } catch (NoSuchAlgorithmException e1) { e1.printStackTrace(); } return string; } private static String byteArrToHexString(byte[] bArr) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < bArr.length; i++) { int unsigned = bArr[i] & 0xff; sb.append(Integer.toHexString((unsigned))); } return sb.toString(); }
Мне пришлось перенести существующую пользовательскую базу данных, где хранятся пароли, хранящиеся в php5 MD5. Теперь некоторые из пользователей, не все, не могут войти в систему, потому что мой код Java не создает правильный хэш MD5.
Любые идеи, что не так с этим?
byteArrToHexString
не преобразовывает байты <0x10 правильно, вам нужно byteArrToHexString
их нулями.
Пример:
int unsigned = bArr[i] & 0xff; if (unsigned < 0x10) sb.append("0"); sb.append(Integer.toHexString((unsigned)));
Настолько забавно … Я только что столкнулся с проблемой с MD5 хэшированием паролей. В моем случае проблема заключалась в кодировании исходного пароля в byte[]
.
Я советую вам выяснить, какая именно кодировка использовалась для хэширования ранее сохраненных паролей и изменить строку 6 вышеприведенного кода на
md5.update(string.getBytes("UTF-8"));
(Конечно, это всего лишь пример … узнать правильную кодировку для использования в качестве параметра)
Кстати, я полагаю, у вас есть свои причины, но почему бы не использовать метод хеширования?
return new String(digest, "UTF-8");
Yuval = 😎
Вам не хватает:
md5.reset();
перед выполнением обновления ()
Проверьте пример Java md5 с MessageDigest