文章出處

說來慚愧,做開發幾年了,一直在吸取,今天也寫寫自已關于技術的一點點理解,不正之處,請大家多多指點。

 

由于之前開發的項目使用的是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

 

以上是個人一點總結,歡迎指正!

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()