如何在PHP中重现java MessageDigest SHA-256哈希值?
问题描述:
我目前已经给出了以下java代码片段作为如何基于提供的'in'和'salt'变量计算哈希的例子。在这些例子中,变量是硬编码来进行测试:如何在PHP中重现java MessageDigest SHA-256哈希值?
package generatehash;
import java.security.MessageDigest;
import sun.misc.BASE64Encoder;
public class GenerateHash {
public static void main(String[] args)
{
String in = "abcdef12345";
String salt = "test1";
try {
MessageDigest hash = MessageDigest.getInstance("SHA-256");
byte[] digest = hash.digest((in + salt).getBytes());
String out = new BASE64Encoder().encode(digest);
System.out.println("Calculated: " + out);
} catch(java.security.NoSuchAlgorithmException e) {
System.err.println("SHA-256 is not a valid message digest algorithm. " + e.toString());
}
}
}
输出这里:
计算:bfiUcT46ftaC76MCbGbpCFisFSlEY96/4CBwdtznaCE =
当试图运行PHP相当于我试过以下:
<?php
ini_set('display_errors','On');
error_reporting(E_ALL);
$in = 'abcdef12345';
$salt = 'test1';
$out = hash('sha256', $in.$salt);
echo 'Calculated: ' . $out;
输出这里是完全不同的:
计算: 6df894713e3a7ed682efa3026c66e90858ac15294463debfe0207076dce76821
我已经尝试了一些变化,但不打标记。有什么我在这里失踪?任何帮助将不胜感激。
答
Java结果在base64中,而php结果在十六进制中。您错过了base64编码raw PHP结果的步骤。
$in = 'abcdef12345';
$salt = 'test1';
$out = hash('sha256', $in.$salt,true); //3rd parameter says return raw result
echo 'Calculated: ' . base64_encode($out);
输出:
计算:bfiUcT46ftaC76MCbGbpCFisFSlEY96/4CBwdtznaCE =
例子: http://sandbox.onlinephpfunctions.com/code/bb12ed98c16e2b732f29292da75aeebc36da2d48
啊,谢谢!你是冠军。我实际上已经尝试过使用bae64_encode(),但仍然得到错误的结果 - 但是我看到我错过了hash()函数的第三个参数。 – Manachi
是的,没有第三个参数,PHP会对结果做一些自己的后处理。 – apokryfos