2010-05-18 5 views
1

Java에서 비밀번호를 암호화하는 기능이 있지만, MessageDigest를 호출하면 같은 비밀번호로 호출해도 매번 다른 결과가 반환됩니다. 나는 그것이 어떻게 든 잘못 초기화하고 있는지 궁금해.Java MessageDigest 결과가 일정하지 않습니다.

public String encrypt (String password) { 
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    md.reset();  
    md.update(password.getBytes(Charset.forName("utf-8")),0,password.length()); 
    String res = md.digest().toString(); 
} 

답변

1

.digest()의 반환 값은 당신에게없는 내용의 배열의 표현을 제공입니다 byte[].toString() 방법.

바이트 배열을 16 진수 문자열로 변환하는 방법은 this answer을 참조하십시오.

또 다른 방법은 Arrays.toString(byte[])을 사용하는 것이지만 원하는 형식을 제공하지는 못합니다.

+1

정확히 md.digest '()가 toString'이 바이트 배열의 내용과 관계가 없다.. 그냥 객체 표현입니다. 대안 'StringBuffer hexString = new StringBuffer(); \t (int i = 0; i

1

당신은 메소드 서명을 변경할 수 있습니다 :

public byte[] encrypt (String password) { 
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    md.reset(); 
    md.update(password.getBytes(Charset.forName("utf-8")), 0, password.length()); 
    return md.digest(); 
} 

을 ... 그리고 다이제스트를 비교하는 Arrays.equals(byte[], byte[])를 사용합니다.

3

간단한 코드 세 가지 결과를 얻게

MessageDigest digest = MessageDigest.getInstance("MD5"); 
    System.out.println("test1 "); 
    System.out.println(digest.digest("test".getBytes("UTF-8"))); 

    Thread.sleep(10000);   
    System.out.println("test2 "); 
    System.out.println(digest.digest("test".getBytes("UTF-8"))); 

    Thread.sleep(10000); 
    System.out.println("test3 "); 
    System.out.println(digest.digest("test".getBytes("UTF-8"))); 
+1

SHA-1 다이제스트와 동일한 동작, 매우 어색함 ... 일정해야합니다. 그렇지 않아야합니까? – Meex

+0

'digest()'함수는'byte []'를 반환합니다. 세 번 실행하면 세 개의 서로 다른 바이트 배열 참조를 반환하지만 동일한 다이제스트 바이트를 포함합니다. 배열 참조 자체 대신 바이트 배열의 16 진수 문자열을 인쇄하여 확인할 수 있습니다. –

관련 문제