java md5加密踩坑记录:特殊转义字符问题
在进行md5加密时,可能会遇到特殊字符转义的问题,导致加密结果与预期不一致。最近,我们在使用php和java对字符串进行md5加密时就遇到了这样的问题。
php中的代码如下:
$pwd=123456; echo md5($pwd."\xa3");
这段代码使用"xa3"对字符串进行了转义,结果为e885a841c486e07e91290546698f748c。
而在java中,相同的字符串使用"xa3"转义后,md5加密结果却不同:
int str="123456"; return getmd5(str+"\xa3");
加密结果为3245fdd037dda90671a058373e238244。
经过查证发现,php中的"xa3"会被转义为"u00a3"(unicode码)。而java中直接使用"xa3",导致它仅被当作一个普通的字符进行加密,而非转义字符。
解决方法是将java中的转义字符正确转换为unicode码。可以参考以下代码:
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中的结果一致,问题得到解决。
SpringBoot项目中如何便捷地查看发送到Redis服务器的命令?
在Java中声明ConcurrentHashMap时是否需要static关键字取决于你的使用场景和需求。如果你希望这个ConcurrentHashMap在整个应用程序的生命周期中都是共享的,并且能够被类的所有实例访问,那么你可以使用static关键字。例如: ```java private static ConcurrentHashMap map = new ConcurrentHashMap(); ``` 这样,`map`就会成为一个类变量,而不是实例变量,所有的类实例都可以访问和修改这个共享的ma
口袋妖怪战斗模拟器/对决克隆开发日志#0
线程堆栈大小与内存溢出:为什么复制2KB数据到1KB线程堆栈不溢出?
函数式编程与 OOP 编程在 Java 流处理中的应用
Mybatis 报错 \"Property \'sqlSessionFactory\' or \'sqlSessionTemplate\' are required\" 如何解决?