코드의 이러한 (PHP 및 Java) 코드 스 니펫이 동일한 입력에 대해 동일한 SHA512를 반환하지 않는 이유를 알아낼 수 있습니까?Java SHA512 다이제스트 출력이 PHP 스크립트와 다릅니다
이public String processSHA512(String pw, String salt, int rounds)
{
try {
md = MessageDigest.getInstance("SHA-512");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException("No Such Algorithm");
}
String result = hashPw(pw, salt, rounds);
System.out.println(result);
return result;
}
private static String hashPw(String pw, String salt, int rounds) {
byte[] bSalt;
byte[] bPw;
String appendedSalt = new StringBuilder().append('{').append(salt).append('}').toString();
try {
bSalt = appendedSalt.getBytes("ISO-8859-1");
bPw = pw.getBytes("ISO-8859-1");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Unsupported Encoding", e);
}
byte[] digest = run(bPw, bSalt);
Log.d(LCAT, "first hash: " + Base64.encodeBytes(digest));
for (int i = 1; i < rounds; i++) {
digest = run(digest, bSalt);
}
return Base64.encodeBytes(digest);
}
private static byte[] run(byte[] input, byte[] salt) {
md.update(input);
return md.digest(salt);
}
base64 인코딩의 도서관이있다 :
$password = 'whateverpassword';
$salt = 'ieerskzcjy20ec8wkgsk4cc8kuwgs8g';
$salted = $password.'{'.$salt.'}';
$digest = hash('sha512', $salted, true);
echo "digest: ".base64_encode($digest);
for ($i = 1; $i < 5000; $i++) {
$digest = hash('sha512', $digest.$salted, true);
}
$encoded_pass = base64_encode($digest);
echo $encoded_pass;
이
은 안드로이드 응용 프로그램의 코드입니다 base64lib이 자바 코드는 실제로 내가 다른 질문을 주위에 발견 된 일부 수정 된 코드 스택 오버플로. Android 코드가 정상적으로 실행되고 있지만 PHP 스크립트의 결과와 일치하지 않습니다. 첫 번째 해시와 일치하지 않습니다.
주 1 : 원시 이진 출력을
주 2를 반환 hash('sha512',$input, $raw_output)
PHP에 : 자바에 나는 캐릭터 세트 (UTF-8, ASCII)를 변경하려고하지만 그것도 작동하지 않았다.
참고 3 : 서버의 코드를 변경할 수 없으므로 내 안드로이드 코드를 변경하는 방법에 대한 답변을 보내 주시면 감사하겠습니다.
안드로이드와 PHP에서 이것 좀보세요 : http://www.coderblog.de/producing-the-same-sha-512-hash-in-java-and-php/#comment-614 ... 도움이되었습니다. 나 :) – Buksy