簡體   English   中英

PHP和Java中的SHA256

[英]SHA256 in PHP & Java

我正在將一些Java代碼移植到PHP代碼中。 在Java中,我有一個哈希SHA256代碼,如下所示:

public static String hashSHA256(String input)
        throws NoSuchAlgorithmException {
    MessageDigest mDigest = MessageDigest.getInstance("SHA-256");

byte[] shaByteArr = mDigest.digest(input.getBytes(Charset.forName("UTF-8")));
    StringBuilder hexStrBuilder = new StringBuilder();
    for (int i = 0; i < shaByteArr.length; i++) {
        hexStrBuilder.append(Integer.toHexString(0xFF & shaByteArr[i]));
    }

    return hexStrBuilder.toString();
}

在PHP中,我哈希如下:

$hash = hash("sha256", utf8_encode($input));

我用input =“test”運行示例代碼。 但是,我得到了2個不同的哈希字符串:

Java: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2bb822cd15d6c15b0f0a8
PHP: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

有人可以向我解釋為什么以及如何讓它們相互匹配? 請注意,我無法修改Java實現代碼,只能修改PHP。

萬分感激!

PHP版本是正確的; 測試的SHA-256校驗和是9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

Java版本返回相同的校驗和,其中兩個0被剝離。 這是因為您將字節轉換為十六進制的方式。 而不是&與荷蘭國際集團他們0xFF ,使用String.format()這個答案

hexStrBuilder.append(String.format("%02x", shaByteArr[i]));

我意識到你說你不能修改Java代碼,但它是不正確的

PHP版本是正確的。 但是我們可以修改結果以使用java代碼獲得相同的結果。

function hash256($input) {
    $hash = hash("sha256", utf8_encode($input));
    $output = "";
    foreach(str_split($hash, 2) as $key => $value) {
        if (strpos($value, "0") === 0) {
            $output .= str_replace("0", "", $value);
        } else {
            $output .= $value;
        }
    }
    return $output;
}

echo hash256("test");

結果:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2bb822cd15d6c15b0f0a8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM