문제

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top