【发布时间】:2014-03-20 05:04:22
【问题描述】:
有人能弄清楚为什么这些(php 和 java)sn-ps 代码的输出不会为相同的输入返回相同的 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 代码的任何答案。
【问题讨论】:
-
对于任何在 Android 和 PHP 中遇到 sha512 问题的人,看看这个:coderblog.de/producing-the-same-sha-512-hash-in-java-and-php/… ... 它帮助了我 :)