2012-06-08 4 views
2

로 문자열을 해시 비교 :자바는 SHA-256은 내가 예를 시도하고 암호를 일반 텍스트 문자열

String hashAlgorithm ="sha-256" 
... 
md=MessageDigest.getInstance(hashAlgorithm); 
byte[] enteredPasswordDigest = md.digest(policy.getPassword().getBytes()); 
if (!MessageDigest.isEqual(enteredPasswordDigest, realPassword.getBytes())) { 
    ... 
} 

그러나, 해시 된 암호가 데이터베이스에 문자열로 저장됩니다. 그 비교를하면 실패합니다. 디버그 할 때 enteredPasswordDigest의 길이는 32 바이트이고 realPassword.getBytes()의 길이는 64 바이트입니다.

무엇을 놓쳤습니까?

+0

realPassword.getBytes()의 길이가 바이트가 아닌 64 비트 (= 8 바이트)입니까? 왜냐하면 64 비트 출력을 생성하는 보안 해시 함수를 알지 못하기 때문입니다. – Robert

답변

0

나는 데이터베이스에 문자열로 해시 된 암호는 "hex"입니다. 그것이 핵심 포인트입니다. 그래서 나는 입력 된 암호의 바이트 배열 다이제스트의 16 진수를 얻었다. 그런 다음 16 진수 값을 가진 문자열을 비교했습니다.

+0

당신이 찾고있는 것을 관리 했으므로 더 나은 보안을 위해 소금을 칠하는 것을 고려하고 싶을 것입니다. – Jeach

0

realPassword가 String이라고 가정하면 Java 문자열은 UTF16, 즉 문자 당 2 바이트입니다. 무슨 일이 벌어지고 있는지보다 나은 통찰력을 얻으려면 두 바이트 어레이를 모두 인쇄 해보십시오. 간단히

1

,

  • 가 입력 한 암호 해시를 가지고/
  • 이 (가) byte[] 문자열로
  • 는 DB
에 이미 해시 - 암호 문자열에 해당 문자열을 비교 변환을 소화

시도해보십시오.

String hashedStr = new String(enteredPasswordDigest); 
if (!hashedStr.equals(realPassword)) { 
    ... 
} else { 
    ... 
} 

문서 :String.getBytes()

이 문자열이 디폴트의 캐릭터 세트 encode 할 수없는 경우,이 메소드의 동작은 지정되지 않습니다. 인코딩 과정을 더 많이 제어 할 때 이 필요하면 java.nio.charset.CharsetEncoder 클래스를 사용해야합니다.

+0

hashedStr의 길이는 32이지만 realPassword는 64입니까? – kamaci

+0

@kamaci :'realPassword.getBytes(). length'는 64입니다. 저는 이것을 사용하지 않고 있습니다. 내 게시물에 표시된대로 'realPassword'itself 문자열을 사용하십시오. 그리고 그것의 길이는 실제로 32입니다. –