首页 > 代码库 > C# java MD5加密方不一致问题

C# java MD5加密方不一致问题

说来惭愧,做开发几年了,一直在吸取,今天也写写自已关于技术的一点点理解,不正之处,请大家多多指点。

 

由于之前开发的项目使用的是C#,用户信息使用的C#的MD5加密码方式,而现在需要切换到Java平台下,关键问题是如何将用户信息通过Java方式的MD5加密码到与C#同样的结果。

 

经过查询资料与测试,Java与C#默认的MD5加密结果是一致的,主要是编码问题。

测试一:

C#代码  默认编码加密

 1   class Program 2     { 3         static void Main(string[] args) 4         { 5             String cleanString = "111111"; 6  7  8             System.Console.Write(MD5(cleanString)); 9 10          11             Console.Read();12 13         }14 15 16         public static string MD5(string sText)17         {18             Byte[] clearBytes =Encoding.Default.GetBytes(sText);19             Byte[] hashedBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);20             return BitConverter.ToString(hashedBytes);21         }22     }
View Code

 

Java代码  默认编码加密

 1 public static void main(String[] args) throws NoSuchAlgorithmException, 2             UnsupportedEncodingException { 3         String s = "111111"; 4       System.out.println(makeMD5(s)); ; 5  6     } 7  8     public static String makeMD5(String password) { 9         MessageDigest md;10         try { 11             md = MessageDigest.getInstance("MD5"); 12             md.update(password.getBytes()); 13             byte[] bPwd=md.digest(); 14             String pwd = new BigInteger(1, bPwd) .toString(16); 15             if(pwd.length()%2==1){16                 pwd="0"+pwd;17             } 18             int length=pwd.length();19             StringBuffer sb=new StringBuffer(length+length/2-1); 20             for(int i=0;i<length;i+=2){ 21                 sb.append(pwd.substring(i, i+2));22                 if(i+2<length)23                     sb.append("-");24             }   25             return sb.toString().toUpperCase();26         } catch (Exception e) {27             e.printStackTrace();28         }29         return password;30     }

说明:为了C#达到一致的格式,这里做了循环格式化 

测试二 Unicode编码

C# 将 上述代码中

1  Byte[] clearBytes =Encoding.Default.GetBytes(sText);

修改为

1  Byte[] clearBytes =Encoding.Unicode.GetBytes(sText);

结果:

70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1A

 

Java 将

1 md.update(password.getBytes()); 

修改为: 

1 md.update(password.getBytes("UTF-16LE")); 

结果:

70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1A

 

 

经过多轮测试,结果如下:

java与C#通过MD5加密结果不致,一般都是编码问题,下面列出编码对照

 

JAVA(加密码111111)C#(加密码111111)
US-ASCII96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12ASCII96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
ISO-8859-1 96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12ISO-8859-196-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
UTF-8

96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12

UTF-896-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
UTF-16BEAA-61-7C-C9-92-81-C9-F5-1C-A0-72-9D-B9-30-FD-3DBigEndianUnicodeAA-61-7C-C9-92-81-C9-F5-1C-A0-72-9D-B9-30-FD-3D
UTF-16LE70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1AUnicode70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1A
UTF-166A-97-04-80-3E-CC-65-94-2F-A4-4E-F7-3A-11-B7-80- 
- UTF-796-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
- UTF-32B7-7D-95-DB-0C-A3-41-3E-0F-79-F4-C5-47-F8-25-E5

 

 

 

 

 

 

 

 

 

java编码:http://docs.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html

 

以上是个人一点总结,欢迎指正!

 

C# java MD5加密方不一致问题