MD5加密 JAVA和C#结果不同

867 阅读1分钟

最近在项目中遇到了一个问题,我是用java做的开发,一样的密码我用md5加密怎么样都不能和对方使用c#的md5加密保持一致,然后我想到了一个最简单的方法让他们提供接口我直接调用,接着我就去找了我的老大,结果被一口回绝了呜呜。然后我就各种百度,发现事情逐渐变得有意思起来。

4358c0d42d72fb1329188afaa16608b.jpg

目的

  • 解决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加密都是一样的(除非更改了加密算法) image.png
  • 同时我收集到另一个有用的信息点就是unicode编码格式会影响到md5的加密结果

解决

  • md5加密的源数据必须是字节数组。
  • 而同一个字符串用不同的编码,转出来的字节数组内容就会不同,md5结果当然不一样的。
  • 关键是编码要保持一致。
  • 所以我就换了一个编码发现完美解决这个问题

主要代码

    MessageDigest md;
    md = MessageDigest.getInstance("MD5");
    md.update(password.getBytes("UTF-16LE"));

结果

image.png

结尾

综上所述md5加密同一组数据,编码不同会影响结果。嘿嘿嘿就到这里。还有就是mysql迁移库到sqlserver好多的坑啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

ea8977abb85f05aef52d0341816d6ea.jpg