在使用MessageDigest进行md5加密前, 需要把使用String的getBytes方法获得字节数组
需要注意的是getBytes()方法在不传入参数的情况下, 使用的是系统默认的编码方式.
同一个字符串在不同的编码方式下, 获取到的字节数组是不同的, 这会引起,md5加密后得到的值不同.
所以一般最好确认编码方式并作为参数传入:
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(str.getBytes("utf-8")); //str是加密前的字符串
这个bug其实是相对容易发现的, 但是当时遇到了另一个问题
我在main中调试, 但是这个方法最终是拿到tomcat下运行
因为有一些特殊配置, 我的这个tomcat后来从其它地方拷贝过来的, 自己并没有修改过配置
so:
在main中debug和run运行的时候, getBytes是按照jvm环境来的, 我配置的是utf-8
在拿到tomcat下后, getBytes按照tomcat的配置的编码来, 刚好这个tomcat没有配置编码, 所以是按照本机来的, 也就是windows的默认gbk
============
吐槽下: 至今还会掉到编码格式的坑里面的我, 基础和debug的能力依旧相当弱鸡