4

I'm porting some Java code to PHP code. In Java I have a hash SHA256 code as below:

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();
}

In PHP, I hash as below:

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

I run the sample code with both input = "test". However, I got 2 hash strings which are not the same:

Java: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2bb822cd15d6c15b0f0a8
PHP: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

Can someone explain to me why and how to get them match each other? Please note that I cannot modify the Java implementation code, only to modify PHP.

Really appreciate!

0

2 Answers 2

7

The PHP version is correct; the SHA-256 checksum of test is 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08.

The Java version is returning the same checksum with two 0s stripped out. This is because of the way you're converting bytes into hex. Instead of &ing them with 0xFF, use String.format(), as in this answer:

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

I realise you say you cannot modify the Java code, but it is incorrect!

Sign up to request clarification or add additional context in comments.

Comments

1

The PHP version is correct. But we can modify the result to have the same result with java code.

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");

result: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2bb822cd15d6c15b0f0a8

1 Comment

$output .= $value; instead of the if else worked perfect for me!!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.