2017-01-10 3 views
1

에서 MD5 해시 생성 here에 대한 해결책을 찾았습니다.char []

private byte[] toBytes(char[] chars) { 
    CharBuffer charBuffer = CharBuffer.wrap(chars); 
    ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer); 
    byte[] bytes = Arrays.copyOfRange(byteBuffer.array(), 
      byteBuffer.position(), byteBuffer.limit()); 
    Arrays.fill(charBuffer.array(), '\u0000'); // clear sensitive data 
    Arrays.fill(byteBuffer.array(), (byte) 0); // clear sensitive data 
    return bytes; 
} 

char[] stringChars = "String".toCharArray(); 
byte[] stringBytes = toBytes(stringChars); 

MessageDigest md = MessageDigest.getInstance("MD5"); 
md.update(stringBytes); 
String stringHash = new BigInteger(1, md.digest()).toString(16); 

Arrays.fill(stringChars, '\u0000'); 
Arrays.fill(stringBytes, (byte) 0); 

는하지만 어디 또는 그런 일이 어떻게 알아낼 수 없습니다, 버그를 갖고있는 것 같아요.

String hashedPass = new BigInteger(1, md.digest()).toString(16); 

위의 코드의 출력은 문자열을 제공합니다 : 그것은 MD5의 맨 앞에 0이없는 것 같다

String = "9a9cce201b492954f0b06abb081d0bb4"; 
Correct MD5 of above string = "0e67b8eb546c322eeb39153714162ceb", 
The code above though gives = "e67b8eb546c322eeb39153714162ceb"; 

문제는 내가 생각하는이 부분이다.

+0

[이 답변] (http://stackoverflow.com/a/421696/369) 제로와 단순히 왼쪽 패딩을 제안 - 더 나은 솔루션이 있는지 모르겠어요. – Blorgbeard

+0

@Blorgbeard이 게시물을 링크 해 주셔서 감사합니다. 문제에 대한 여러 가지 (해결할 수있는) 솔루션이 많이있는 것 같습니다. 하나가 다른 것보다 안전합니까? –

+3

보안이 필요한 무언가에 MD5를 사용한다면 알고리즘을 전환해야합니다. 이 해시로 대체 뭐하고 있니? – Blorgbeard

답변

4

이 작업에는 BigInteger을 사용할 필요가 없으므로 바이트 배열을 16 진수 문자열로 변환하는 방법을 작성하십시오.

static String hexEncode(byte [] data) { 
    StringBuilder hex = new StringBuilder(); 
    for (byte b : data) hex.append(String.format("%02x", b)); 
    return hex.toString(); 
} 

String hash = hexEncode(md.digest()); 
+0

대단히 고마워요! 나는 이것을 다음과 같이 사용했다 : StringBuffer sb = new StringBuffer(); for (byte b : digest) {sb.append (String.format ("% 02x", b & 0xff))} 이렇게하면 앞에 오는 0 문제도 해결됩니다. 이 주석에 코드를 사용하는 방법을 모르겠다 ... 이것은 정말로 성가신 일이다. –