PHP生成的SHA256哈希与Java Guava不一致,求PHP端解决方案
问题根源与PHP端修复方案
两者哈希结果不匹配的核心原因是字符串编码处理逻辑不同:
- Java Guava的
hashUnencodedChars方法,会把字符串中的每个char以**UTF-16BE(大端序16位Unicode编码)**格式转换为字节流,再计算SHA256哈希。 - PHP的
hash("sha256")默认是将字符串按UTF-8编码成字节后计算哈希,编码方式的差异直接导致了结果不一致。
要在PHP端匹配Java的哈希结果,只需把字符串转换成UTF-16BE编码后再哈希,修复后的代码如下:
$salt = "0123456789012345"; $password = "password"; $combinedStr = $salt . "|" . $password; // 转换为UTF-16BE编码(确保原字符串为UTF-8格式) $utf16beBytes = mb_convert_encoding($combinedStr, 'UTF-16BE', 'UTF-8'); // 计算SHA256哈希 echo hash("sha256", $utf16beBytes);
执行这段PHP代码,输出结果会和Java代码的输出完全一致:818112d34d341ace8b9325fce61e676a125f733e25c28c9ed172c1f7d2c3aa6c
内容的提问来源于stack exchange,提问作者wilku
相关产品推荐
相关产品推荐

