最近在项目中遇到了一个问题,我是用java做的开发,一样的密码我用md5加密怎么样都不能和对方使用c#的md5加密保持一致,然后我想到了一个最简单的方法让他们提供接口我直接调用,接着我就去找了我的老大,结果被一口回绝了呜呜。然后我就各种百度,发现事情逐渐变得有意思起来。
目的
- 解决c# md5与java md5加密不一致的问题
问题
- 使用md5加密123456
- 他们的结果为 :CE-0B-FD-15-05-9B-68-D6-76-88-88-4D-7A-3D-3E-8C
- 我的结果为 :E1-0A-DC-39-49-BA-59-AB-BE-56-E0-57-F2-0F-88-3E
过程
- 通过百度我发现MD5加密得到的结果一般是16位或者32位,不管是什么语言MD5加密都是一样的(除非更改了加密算法)
- 同时我收集到另一个有用的信息点就是unicode编码格式会影响到md5的加密结果
解决
- md5加密的源数据必须是字节数组。
- 而同一个字符串用不同的编码,转出来的字节数组内容就会不同,md5结果当然不一样的。
- 关键是编码要保持一致。
- 所以我就换了一个编码发现完美解决这个问题
主要代码
MessageDigest md;
md = MessageDigest.getInstance("MD5");
md.update(password.getBytes("UTF-16LE"));
结果
结尾
综上所述md5加密同一组数据,编码不同会影响结果。嘿嘿嘿就到这里。还有就是mysql迁移库到sqlserver好多的坑啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!