我尝试使用ISO-8859-1编码在PHP中生成SHA-256十六进制,但没有找到办法。
这是"测试用例" (硬编码)我试图完成:
function getHash($str) {
return hash('sha256', $str);
}
$str1 = "Luiz";
$result1 = getHash($str1);
$expect1 = '0dd0029404cbe8bbad2cd84ec0f5089e4ca29d46719323b15595ffa765a88ffe';
$success1 = $result1 == $expect1 ? 'true' : 'false';
$str2 = "Luíz";
$result2 = getHash($str2);
$expect2 = '7e957af88c30f35d2fa32d6dd1c9931d3bb8a52b798277bfcbe06736f03d6828';
$success2 = $result2 == $expect2 ? 'true' : 'false';
echo "Test 1: ".$str1."<br/>";
echo "Result should be: ".$expect1."<br/>";
echo "Result is: ".$result1."<br/>";
echo "Success? ".$success1;
echo "<br/><br/><br/>";
echo "Test 2: ".$str2."<br/>";
echo "Result should be: ".$expect2."<br/>";
echo "Result is: ".$result2."<br/>";
echo "Success? ".$success2;
第一个测试用例工作正常,但第二个测试用例失败(因为编码)。
我已尝试过所有可能的事情...... pack
,unpack
,bin2Hex
,mb_convert_encoding
......没有任何效果。
我尝试这样做的原因是与第三方产品集成,期望在ISO-8859-1中使用SHA-256哈希。
他们在Java中的例子是这样的:
public class TokenGenerator {
private static String getSha256Hash(final String x) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest(x.getBytes("ISO-8859-1"));
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String str = "EXAMPLE_STRING";
System.out.println(getSha256Hash(str));
}
}
正如您在上面的示例中所看到的,Java版本强制哈希处于ISO-8859-1中。 我相信PHP实现只适用于UTF-8,但我不确定。 有没有办法做到这一点?