2017-07-07 127 views
0

我目前已經給出了以下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

我已經嘗試了一些變化,但不打標記。有什麼我在這裏失蹤?任何幫助將不勝感激。

回答

1

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