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-ASCII 96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12 ASCII 96-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-12 ISO-8859-1 96-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-8 96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
UTF-16BE AA-61-7C-C9-92-81-C9-F5-1C-A0-72-9D-B9-30-FD-3D BigEndianUnicode AA-61-7C-C9-92-81-C9-F5-1C-A0-72-9D-B9-30-FD-3D
UTF-16LE 70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1A Unicode 70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1A
UTF-16 6A-97-04-80-3E-CC-65-94-2F-A4-4E-F7-3A-11-B7-80 -  
-   UTF-7 96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
-   UTF-32 B7-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

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

原文地址:https://www.cnblogs.com/zengguoyu/p/3973483.html