我正在将一些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& ing使用它们,使用String.format(),如this answer:
hexStrBuilder.append(String.format("%02x", shaByteArr[i]));
我意识到你说你不能修改Java代码,但它是不正确的!
标签:java,php,hash,sha256 来源: https://codeday.me/bug/20190725/1530972.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。