Java_MD5的使用


在Java中使用MD5摘要還是很方便的,直接上代碼。

 1 package com.cxc.nothing;
 2 
 3 import java.nio.charset.Charset;
 4 import java.security.MessageDigest;
 5 
 6 public class MD5Test {
 7     public static void main(String[] args) {
 8 
 9         String text = "MD5Test";
10         try {
11             MessageDigest messageDigest = MessageDigest.getInstance("MD5");
12             byte[] md5Bytes = messageDigest.digest(text.getBytes(Charset.forName("UTF-8")));
13             for (byte b : md5Bytes) {
14                 System.out.println(b);
15             }
16         } catch (Exception e) {
17             e.printStackTrace();
18         }
19 
20     }
21 
22 }

以上代碼就可以實現MD5摘要了。由於摘要的結果是字節數組,並不是我們常見的字符串,所以還有工作要做。

字節數組轉字符串,還不簡單,直接String str = new String(md5Bytes);結果,打印出來之后,才發現我太天真了。

然后各種百度之后,我終於知道了,原來這里的字節數組不能直接轉字符串,而通常的做法是轉成十六進制的數字。

MD5摘要的結果是一個128bit的大整數,

因為8bit表示一字節,所以當用字節表示的時候就會是128/8=16個字節。

因為4bit表示一個十六進制,所以當用十六進制表示的時候就會是128/4=32個十六進制數字。

如果你打印上面代碼的md5Bytes,你就會看到如下的一個字節數組:

[-83, -42, -124, -31, -122, 59, 93, -112, 5, -125, 35, 104, 37, -92, 49, -62]

這里一共16個字節,而每個字節都需要拆分成兩個十六進制數字。

我們先拿59來拆,這里的59是十進制的,把她寫成8位的二進制0011 1011,再4位為一組轉成十六進制就是3 B,所以這里的59,最后轉化完就是3B。

接下來看看5,把她轉成8位的二進制0000 0101,再4位為一組轉成十六進制就是0 5,所以這里的5,最后轉化完就是05,注意是“05”,而不是“5”。

正整數的拆分都同上,接下來就是負整數的拆分了。

接下來我們拆分-83,因為-83是負整數,所以實際存的是他的補碼。求負整數的補碼,將其對應正數二進制表示所有位取反(包括符號位,0變1,1變0)后加1。

先寫出83的二進制表示01010011,然后取反就是10101100,再加1就是10101101,所以-83實際存儲的二進制應該是1010 1101,同樣4位為一組轉成十六進制就是A D。

下面附上轉化

 -83-->1010 1101-->A D
 -42-->1101 0110-->D 6
-124-->1000 0100-->8 4
 -31-->1110 0001-->E 1
-122-->1000 0110-->8 6
  59-->0011 1011-->3 B
  93-->0101 1101-->5 D
-112-->1001 0000-->9 0
   5-->0000 0101-->0 5
-125-->1000 0011-->8 3
  35-->0010 0011-->2 3
 104-->0110 1000-->6 8
  37-->0010 0101-->2 5
 -92-->1010 0100-->A 4
  49-->0011 0001-->3 1
 -62-->1100 0010-->C 2
change

所以MD5摘要實際上生成的128bit是(請無視空格):1010 1101 1101 0110 1000 0100 1110 0001 1000 0110 0011 1011 0101 1101 1001 0000 0000 0101 1000 0011 0010 0011 0110 1000 0010 0101 1010 0100 0011 0001 1100 0010

最終轉化成32位的十六進制表示就是ADD684E1863B5D900583236825A431C2

以上寫的是轉化的思路,具體的實現,網上有很多代碼,這里就不貼出來了。

在完成這篇文章之前,我參考了如下資料,在此表示感謝:

http://www.cnblogs.com/renchunxiao/p/3411370.html

http://blog.csdn.net/hll174/article/details/51063689

http://blog.csdn.net/jiaomenglei/article/details/52728796

https://wenku.baidu.com/view/3145fb45ad51f01dc281f1c5.html

https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM