SHA256 in PHP & Java
hash, java, php, sha256
Solution
The PHP version is correct; the SHA-256 checksum of test is `9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08`.
The Java version is returning the same checksum with two `0`s 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!
Problem
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!