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에서 인코딩해보십시오. 시작하려면 ... 16베이스의 94는 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 Codec 라이브러리의 유틸리티 클래스를 사용하여 1 라이너로 단축 할 수 있습니다 (http://commons.apache.org/codec)
String md = org.apache.commons.codec.digest.DigestUtils.md5hex("whatever");
그 두 사람은 동일합니다. Java One은 소수점 인 것 같습니다. 16 진수로 변환하십시오.
소수점 바이트를 16 진수로 변환하는 것을 고려하십시오. 예를 들어, 94베이스 10은 5e베이스 16이다.
기본이 다르기 때문입니다. MySQL MD5 결과는 Base-16이고, Java MD5는 Base-10에 있습니다.
더 도와 줄 수 있으면 좋겠지 만 수학이 악취가납니다. 내 친구가 PHP의 Base-16 체크섬에서 Base-10 체크섬을 생성하는 데 도움이되었지만 스크립트를 잃었습니다. 이를 기반으로 답변을 찾을 수 있기를 바랍니다.
String password = org.springframework.util.DigestUtils.md5DigestAsHex("password".getBytes())
System.out.println(password)
내가 어떻게하는지보세요, 코드는 자체적으로 설명 할 수 있습니다!
자바 코드 :
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 : CLEARTEXT : 5AB677EC767735CEBD67407005786016
동일한 해시를 생성하는 MySQL 쿼리 :
SELECT md5( 'cleartext' );
산출:
md5 ( 'cleartext')
5AB677767735CEBD67407005786016
바퀴를 재창조하는 대신 Apache Commons Codec (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 Codec 라이브러리의 유틸리티 클래스 사용 : http://commons.apache.org/codec/
String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password");
System.out.println(password);