これらの (php および Java) コード スニペットの出力が、同じ入力に対して同じ SHA512 を返さない理由を誰かが理解できますか?
$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;
これは、Android アプリケーションのコードです。
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 エンコーディング用のライブラリはこれです: base64lib
この Java コードは、実際には StackOverflow の別の質問で見つけた修正コードです。Android コードは正常に実行されていますが、php スクリプトからの出力と一致しません。最初のハッシュとさえ一致しません!
注 1: PHP ではhash('sha512',$input, $raw_output)
生のバイナリ出力が返されます
注2:Javaで文字セット(UTF-8、ASCII)を変更しようとしましたが、うまくいきませんでした。
注3:サーバーからのコードは変更できないため、Androidコードの変更方法に関する回答をいただければ幸いです。