MySQL MD5 и Java MD5 не равны
-
06-07-2019 - |
Вопрос
Следующая функция в MySQL
MD5( 'secret' )
генерирует 5ebe2294ecd0e0f08eab7690d2a6ee69
Я хотел бы иметь Java-функцию для генерации того же результата.Но
public static String md5( String source ) {
try {
MessageDigest md = MessageDigest.getInstance( "MD5" );
byte[] bytes = md.digest( source.getBytes("UTF-8") );
return getString( bytes );
} catch( Exception e ) {
e.printStackTrace();
return null;
}
}
private static String getString( byte[] bytes ) {
StringBuffer sb = new StringBuffer();
for( int i=0; i<bytes.length; i++ ) {
byte b = bytes[ i ];
sb.append( ( int )( 0x00FF & b ) );
if( i+1 <bytes.length ) {
sb.append( "-" );
}
}
return sb.toString();
}
генерирует
94-190-34-148-236-208-224-240-142-171-118-144-210-166-238-105
Решение
Попробуйте кодирование в базе 16. Просто для начала ... 94 в базе 16 - это 5E.
** Изменить: ** Попробуйте изменить метод getString:
private static String getString( byte[] bytes )
{
StringBuffer sb = new StringBuffer();
for( int i=0; i<bytes.length; i++ )
{
byte b = bytes[ i ];
String hex = Integer.toHexString((int) 0x00FF & b);
if (hex.length() == 1)
{
sb.append("0");
}
sb.append( hex );
}
return sb.toString();
}
Другие советы
заменить
sb.append( ( int )( 0x00FF & b ) );
if( i+1 <bytes.length ) {
sb.append( "-" );
}
Автор:
String hex = Integer.toHexString((int) 0x00FF & b);
if (hex.length == 1) sb.append("0");
sb.append( hex );
Это можно сократить до однострочного с помощью служебных классов из библиотеки кодеков Apache Commons ( http: / /commons.apache.org/codec ) р>
String md = org.apache.commons.codec.digest.DigestUtils.md5hex("whatever");
Эти двое равны. Java, кажется, в десятичном формате. Преобразуйте его в шестнадцатеричное.
Рассмотрите возможность преобразования десятичных байтов в шестнадцатеричные. Например, 94 база 10 - это 5е база 16.
Это потому что база другая. Результат MySQL MD5 в base-16, в то время как Java MD5 в base-10.
Я бы хотел помочь тебе дальше, но моя математика воняет. Мой друг помог мне сгенерировать контрольную сумму base-10 из контрольной суммы base-16 в PHP, но я потерял скрипт. Надеюсь, что вы можете найти свой ответ на основе этого.
String password = org.springframework.util.DigestUtils.md5DigestAsHex("password".getBytes())
System.out.println(password)
Посмотрите, как я это делаю, код понятен сам по себе!
Java- код:
public static void main(String a[]) throws NoSuchAlgorithmException {
String passClear = "cleartext";
MessageDigest md5 = MessageDigest.getInstance("MD5"); // you can change it to SHA1 if needed!
md5.update(passClear.getBytes(), 0, passClear.length());
System.out.printf("MD5: %s: %s ", passClear, new BigInteger(1, md5.digest()).toString(16));
}
Выходной сигнал:
MD5:открытый текст:5ab677ec767735cebd67407005786016
Запрос Mysql, который выдает тот же хэш:
SELECT md5( 'cleartext' );
Выходной сигнал:
md5 ('открытый текст')
5ab677ec767735cebd67407005786016
Вместо того, чтобы изобретать велосипед, попробуйте кодек Apache commons ( http://commons.apache.org/codec / ) который будет обрабатывать шестнадцатеричное кодирование для вас с помощью Hex.encodeHex (byte [])
private String encodeAsMD5(String password) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(password.getBytes());
return new String(Hex.encodeHex(bytes));
}
catch(Exception e) {
e.printStackTrace();
return null;
}
}
Используйте служебные классы из библиотеки кодеков Apache Commons: http://commons.apache.org/codec/ а> р>
String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password");
System.out.println(password);