如何在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

+0

啊,谢谢!你是冠军。我实际上已经尝试过使用bae64_encode(),但仍然得到错误的结果 - 但是我看到我错过了hash()函数的第三个参数。 – Manachi

+1

是的,没有第三个参数,PHP会对结果做一些自己的后处理。 – apokryfos