如何在PHP中重现java MessageDigest SHA-256哈希?

时间:2017-07-07 05:41:22

标签: java php security hash sha256

我目前已经获得了以下java代码片段作为如何基于提供的'in'和'salt'变量计算哈希的示例。在这些示例中,变量是硬编码的,用于测试:

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

我尝试了很多变化,但没有达到标记。这里有什么我想念的吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

Java结果在base64中,而php结果是十六进制。您错过了base64编码原始 PHP结果的步骤。

$frequency = [];

for ($i = 0; $i < sizeof($date); $i++) {
    $frequency[] = array($date[$i], $time_start[$i], $time_end[$i]);
}

print_r($frequency);

// Output:
// Array
// (
//     [0] => Array
//         (
//             [0] => 2017-06-10
//             [1] => 02:00 PM
//             [2] => 05:00 PM
//         )
//
//     [1] => Array
//         (
//             [0] => 2017-06-11
//             [1] => 03:00 PM
//             [2] => 06:00 PM
//         )
//
//     [2] => Array
//         (
//             [0] => 2017-06-12
//             [1] => 04:00 PM
//             [2] => 07:00 PM
//         )
//
// )

输出:

  

计算:bfiUcT46ftaC76MCbGbpCFisFSlEY96 / 4CBwdtznaCE =

实施例: http://sandbox.onlinephpfunctions.com/code/bb12ed98c16e2b732f29292da75aeebc36da2d48