强制charset在PHP中生成SHA-256

时间:2015-11-30 19:09:17

标签: php hash encoding character-encoding sha256

我尝试使用ISO-8859-1编码在PHP中生成SHA-256十六进制,但没有找到办法。

这是"测试用例" (硬编码)我试图完成:

function getHash($str) {
    return hash('sha256', $str);
}

$str1 = "Luiz";
$result1 = getHash($str1);
$expect1 = '0dd0029404cbe8bbad2cd84ec0f5089e4ca29d46719323b15595ffa765a88ffe';
$success1 = $result1 == $expect1 ? 'true' : 'false';

$str2 = "Luíz";
$result2 = getHash($str2);
$expect2 = '7e957af88c30f35d2fa32d6dd1c9931d3bb8a52b798277bfcbe06736f03d6828';
$success2 = $result2 == $expect2 ? 'true' : 'false';

echo "Test 1: ".$str1."<br/>";
echo "Result should be: ".$expect1."<br/>";
echo "Result is: ".$result1."<br/>";
echo "Success? ".$success1;

echo "<br/><br/><br/>";

echo "Test 2: ".$str2."<br/>";
echo "Result should be: ".$expect2."<br/>";
echo "Result is: ".$result2."<br/>";
echo "Success? ".$success2;

第一个测试用例工作正常,但第二个测试用例失败(因为编码)。

我已尝试过所有可能的事情...... packunpackbin2Hexmb_convert_encoding ......没有任何效果。

我尝试这样做的原因是与第三方产品集成,期望在ISO-8859-1中使用SHA-256哈希。

他们在Java中的例子是这样的:

public class TokenGenerator {
    private static String getSha256Hash(final String x) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hash = md.digest(x.getBytes("ISO-8859-1"));
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < hash.length; i++) {
                String hex = Integer.toHexString(0xff & hash[i]);
                if(hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static void main(String[] args) {
        String str = "EXAMPLE_STRING";
        System.out.println(getSha256Hash(str));
    }
}

正如您在上面的示例中所看到的,Java版本强制哈希处于ISO-8859-1中。 我相信PHP实现只适用于UTF-8,但我不确定。 有没有办法做到这一点?

0 个答案:

没有答案