MD5之學習筆記

afei3418發表於2016-01-05

MD5即Message-Digest Algorithm 5(資訊-摘要演算法5),提供訊息完整性保護的一種雜湊函式。它像人的指紋一樣是唯一的 ,多用於使用者登入密碼儲存以及校驗檔案在傳輸過程中是否被修改等。

經常在下載jar包的時候,後邊會有一個MD5 的連結

點選MD5進去之後就是一個字串: 6c10e15835ab214464228a9beb7afba8 *httpd-2.2.31.tar.bz2

在下載完之後可以通過檢視檔案的MD5值來判斷是否被修改

原始資料通過MD5方式形成摘要之後想要找回資料是很困難的,所以安全性高,多數系統和專案在用,下邊給出幾種通過MD5生成摘要的方式:

 

package test;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;




public class testMD5 {
	private static String src="study MD5";
	public static void main(String[] args) {
		jdkMD5();
		bcMD5();
		ccMD5();
	}
	public static void jdkMD5(){
		try {
			MessageDigest md=MessageDigest.getInstance("MD5");
			byte[] jdkMd5bytes=md.digest(src.getBytes());
			//byte 陣列轉換成16進位制
			//方式一 :手動寫轉換16進位制的方法
			String dkMd5Str1=bytesToHex(jdkMd5bytes);
			System.out.println("Java MD5:"+dkMd5Str1);
			//引用第三方包 cc
			String dkMd5Str2=Hex.encodeHexString(jdkMd5bytes);
			System.out.println("Java MD5:"+dkMd5Str2);
			
			String dkMd5Str3=bytes2HexString(jdkMd5bytes);
			System.out.println("Java MD5:"+dkMd5Str3);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	/** 
	 * 位元組轉換成16進位制字串方法一
	 * @param bytes     
	 * @return     
	 * */    
	public static String bytesToHex(byte[] bytes) {        
		StringBuffer md5str = new StringBuffer();        //把陣列每一位元組換成16進位制連成md5字串        
		int digital;    
		for (int i = 0; i < bytes.length; i++) {  
			digital = bytes[i];    
			if(digital < 0) {                
				digital += 256;            
				}            
			if(digital < 16){               
				md5str.append("0");            
				}            
			md5str.append(Integer.toHexString(digital));        
		}        
		return md5str.toString().toUpperCase();    
	}
	/** 
	 * 位元組轉換成16進位制字串方法二
	 * @param bytes     
	 * @return     
	 * */    
	 public static String bytes2HexString(byte[] b) {  
		StringBuffer result = new StringBuffer();  
		String hex;  
		for (int i = 0; i < b.length; i++) {  
		    hex = Integer.toHexString(b[i] & 0xFF);  
		     if (hex.length() == 1) {  
		         hex = '0' + hex;  
		     }  
		     result.append(hex.toUpperCase());  
		 }  
		return result.toString();  
	 }  
	 //BC  引入 bcprov-jdk15.jar
	 public static void bcMD5(){
		 	Digest digest=new MD5Digest();
		 	digest.update(src.getBytes(), 0,src.getBytes().length);
		 	byte[] md5Bytes=new byte[digest.getDigestSize()];
		 	digest.doFinal(md5Bytes, 0);
		 	System.out.println("BC MD5:"+new String(org.bouncycastle.util.encoders.Hex.encode(md5Bytes)));
		 
	 }
	 //CC   引用 commons-codec-1.5.jar
	 public static void ccMD5(){
		 System.out.println("CC MD5:"+DigestUtils.md5Hex(src.getBytes()));
		 
	 }
}


輸出結果:

Java MD5:4C6E2253053B1ED9E515EA0FA8F10439
Java MD5:4c6e2253053b1ed9e515ea0fa8f10439
Java MD5:4C6E2253053B1ED9E515EA0FA8F10439
BC    MD5:4c6e2253053b1ed9e515ea0fa8f10439
CC    MD5:4c6e2253053b1ed9e515ea0fa8f10439

 

 

 

相關文章