2013-03-18 2 views
1

문자열을 md5로 변환하는 간단한 함수를 작성하고 출력에 이상한 문자가 표시됩니다. 일부 문자 인코딩이 엉망이라고 가정합니다. 내가 잘못하고있는 것을 지적 할 수 있습니까?가비지를 표시하는 java md5 해시

public class App 
{ 
public static void main(String[] args){ 
    String str = "helloWorldhelloWorldhelloWolrd"; 
    getHash(str); 

} 

public static void getHash(String str){ 
    try { 
     byte[] three = str.getBytes("UTF-8"); 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] thedigest = md.digest(three); 
     String str1 = new String(thedigest,"UTF-8"); 
     System.err.println(str1); 
    } catch (NoSuchAlgorithmException e) { 

     e.printStackTrace(); 
    }catch (UnsupportedEncodingException e) { 

     e.printStackTrace(); 
    } 
} 

}

출력 : 이 내가

       n?)?????fC?7 
+2

FWIW, 타사 라이브러리를 사용할 수있는 경우 [Guava] (http://guava-libraries.googlecode.com)는 'Hashing.md5()'를 사용하여 한 줄짜리 코드로 16 진 인코딩 MD5 해시를 얻을 수 있습니다. .hashString (문자열, Charsets.UTF_8) .toString()'. –

답변

7

당신은 바로 문자열로 대신 진수 문자열로 바이트를 변환 할 필요가 볼 것입니다 :

byte[] thedigest = md.digest(three); 
StringBuilder buff = new StringBuilder(); 
for (byte b : theDigest) { 
    String conversion = Integer.toString(b & 0xFF,16); 
    while (conversion.length() < 2) { 
    conversion = "0" + conversion; 
    } 
    buff.append(conversion); 
} 
String str1 = buff.toString(); 
System.err.println(str1); 
+2

이것은 작동하지 않습니다. 음수 바이트에 대해서는 걱정할 필요가 있습니다. 즉,'b & 0xFF'를해야하고, 패딩에 대해 걱정해야합니다. 일부 바이트는 선행 0이없는 한 문자로 인코딩되기 때문입니다. –

+0

이것은 내가 사용하는 것입니다 :'final BigInteger bigInt = new BigInteger (1, md.digest()); String.format ("% 032x", bigInt); ' –

+0

@LouisWasserman 음의 바이트는 2의 보수 형식 인 no? –

1

다이제스트를 문자열로 표시 할 수 없습니다. 쓰레기 만 사용) 바이트를 어떻게 든 번역하면 사람이 읽을 수있는 형식으로 표시 할 수 있습니다. Base64 인코더를 제안합니다.

MD5를 문자열 here으로 변환하는 방법을 논의하는 또 다른 스레드가 있습니다.