正文:
在 Java
中实现 MD5
加密时,我们可能会遇到因特殊转义字符处理不当而导致的加密结果偏差问题。最近,我们在对比PHP
和 Java
对同一字符串进行 MD5
加密时,就发现了这样的差异。
在 PHP
中,我们编写了如下代码:
$
pwd
=123456
; echo
md5
($pwd
."\xa3
");
这段代码中,`\xA3
`是对英镑符号的特殊转义,其 MD5
加密结果为`
`。e885a841c486e07e91290546698f748c
为了深入掌握 PHP
,推荐阅读“PHP
免费学习笔记(深入)”。
然而,在 Java
中,对相同字符串使用`\xA3
`转义后,得到的 MD5
加密结果却有所不同:
int
str
="123456
"; return
getmd5
(str
+"\xa3
");
加密结果为
3245fdd037dda90671a058373e238244
。
经过深入研究,我们发现 PHP
中的`\xA3
`会被自动转换为 Unicode
编码`\u00A3
`,而 Java
中直接使用`\xA3
`则将其视为普通字符进行加密,而非预期的转义字符。
为了解决这一问题,我们需要在 Java
中将转义字符正确地转换为 Unicode
编码。以下是一个参考解决方案:
# 汇站网
# https://www.huizhanii.com/38871.html
String pwd = "123456"; String salt = "u00a3"; // 就是 xa3 的 unicode 码 String str = pwd + salt; byte[] bytes = str.getBytes("ISO-8859-1"); //把所有的字节都当成 PHP 默认的 ISO-8859-1 字符来处理 MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digest = md.digest(bytes); String md5Hex = String.format("%02x", new java.math.BigInteger(1, digest)); System.out.println(md5Hex);
通过这种方式,我们可以确保 Java
中的 MD5
加密结果与 PHP
保持一致,避免因特殊转义字符处理不当而导致的加密结果偏差。
转载请注明:汇站网 » PHP和JAVA对特殊转义字符进行MD5加密 结果为什么不一致?