轉:MD5(Message-Digest Algorithm 一種哈希算法)

什麼是MD5算法java

  MD5訊息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被普遍使用的密碼雜湊函數,能夠產生出一個128位元(16位元組)的散列值(hash value),用於確保信息傳輸完整一致。算法

  實質上,MD5 只是一種哈希算法數據庫

  哈希算法,即 hash,又叫散列算法,是一類把任意數據轉換爲定長(或限制長度)數據的算法統稱。例如我叫張三,你叫李四,那麼「人 -> 人名」的算法就叫屬於一種哈希算法。哈希算法一般用於製做數字指紋,數字指紋的意思就是「你看到這個東西就像看到原數據同樣」,例如咱們在一些網站下載大文件的時候,網站提供給咱們驗證文件完整性的 MD5 或者 SHA1 碼,就是原文件的哈希值。哈希算法有不少種,MD5 是其中的一種,這就是 MD5。因此,優秀的哈希算法一般須要具備低碰撞機率(即不一樣數據的哈希值一般也不同)。安全

  Java中的Object.hashCode()方法就是一個摘要算法,它能夠輸入任意數據,它的輸出是一個int類型,即4個字節的固定長度數據,同時,相同的輸入會獲得相同的輸出,這也是重寫equals方法必須重寫hashCode方法的緣由。網絡

MD5屬不屬於加密算法dom

  認爲不屬於的人是由於他們以爲不能從密文(散列值)反過來獲得原文,即沒有解密算法,因此這部分人認爲MD5只能屬於算法,不能稱爲加密算法; 
  認爲屬於的人是由於他們以爲通過MD5處理後看不到原文,即已經將原文加密,因此認爲MD5屬於加密算法;我我的支持前者,正如認爲BASE64算法只能算編碼同樣。函數

  加密,指的是對數據進行轉換之後,數據變成了另外一種格式,而且除了拿到解密方法的人,沒人能把數據轉換回來。所以,加密一般用於網絡通訊。由於網絡上的通訊數據,任何人都有可能會拿到,把數據加密後再傳送,送達之後由對方解密後再查看,就能夠防止網絡上的偷窺。網站

MD5算法是否可逆?編碼

  MD5不可逆的緣由是其是一種散列函數,使用的是hash算法,在計算過程當中原文的部分信息是丟失了的。即從明文到密文的不可逆映射,只有加密過程沒有解密過程,哈希函數能夠將任意長度的輸入通過變化後獲得固定長度的輸出,這個固定長度的輸出稱爲原消息的散列或消息映射。 理想的哈希函數能夠針對不一樣的輸入獲得不一樣的輸出,若是存在兩個不一樣的消息獲得了相同的哈希值,那咱們稱這是一個碰撞)  加密

  不過有個地方值得指出的是,一個MD5理論上的確是可能對應無數多個原文的,由於MD5是有限多個的而原文能夠是無數多個。好比主流使用的MD5將任意長度的「字節串映射爲一個128bit的大整數。也就是一共有2^128種可能,大概是3.4*10^38,這個數字是有限多個的,而可是世界上能夠被用來加密的原文則會有無數的可能性。

  不過須要注意的一點是,儘可能這是一個理論上的有限對無限,不過問題是這個無限在現實生活中並不徹底成立,由於一方面現實中原文的長度每每是有限的(以經常使用的密碼爲例,通常人都在20位之內),另外一方面目前想要發現兩段原文對應同一個MD5(專業的說這叫雜湊衝撞)值很是困難,所以某種意義上來講,在必定範圍內想構建MD5值與原文的一一對應關係是徹底有可能的。因此對於MD5目前最有效的攻擊方式就是彩虹表。

MD5用途 

1.防止被篡改:
  1)好比發送一個電子文檔,發送前,我先獲得MD5的輸出結果a。而後在對方收到電子文檔後,對方也獲得一個MD5的輸出結果b。若是a與b同樣就表明中途未被篡改。
  2)好比我提供文件下載,爲了防止不法分子在安裝程序中添加木馬,我能夠在網站上公佈由安裝文件獲得的MD5輸出結果。
  3)SVN在檢測文件是否在CheckOut後被修改過,也是用到了MD5.

2.防止直接看到明文:
  如今不少網站在數據庫存儲用戶的密碼的時候都是存儲用戶密碼的MD5值。這樣就算不法分子獲得數據庫的用戶密碼的MD5值,也沒法知道用戶的密碼。(好比在UNIX系統中用戶的密碼就是以MD5(或其它相似的算法)經加密後存儲在文件系統中。當用戶登陸的時候,系統把用戶輸入的密碼計算成MD5值,而後再去和保存在文件系統中的MD5值進行比較,進而肯定輸入的密碼是否正確。經過這樣的步驟,系統在並不知道用戶密碼的明碼的狀況下就能夠肯定用戶登陸系統的合法性。這不但能夠避免用戶的密碼被具備系統管理員權限的用戶知道,並且還在必定程度上增長了密碼被破解的難度。)

3.防止抵賴(數字簽名):
  這須要一個第三方認證機構。例如A寫了一個文件,認證機構對此文件用MD5算法產生摘要信息並作好記錄。若之後A說這文件不是他寫的,權威機構只需對此文件從新產生摘要信息,而後跟記錄在冊的摘要信息進行比對,相同的話,就證實是A寫的了。這就是所謂的「數字簽名」。

MD5安全性

  廣泛認爲MD5是很安全,由於暴力破解的時間是通常人沒法接受的。實際上若是把用戶的密碼MD5處理後再存儲到數據庫,實際上是很不安全的。由於用戶的密碼是比較短的,並且不少用戶的密碼都使用生日,手機號碼,身份證號碼,電話號碼等等。或者使用經常使用的一些吉利的數字,或者某個英文單詞。若是我把經常使用的密碼先MD5處理,把數據存儲起來,而後再跟你的MD5結果匹配,這時我就有可能獲得明文。好比某些MD5破解網站,因此如今大多數網站密碼的策略是強制要求用戶使用數字大小寫字母的組合的方式提升用戶密碼的安全度。

目前經常使用的摘要算法:

java中對MD5算法的使用:

public class SummaryAlgorithm {

	public static void main(String[] args) throws UnsupportedEncodingException {
		String str = "MD5摘要算法";
		byte[] testByte = toMD5(str.getBytes());
		System.out.println(String.format("%32x", new BigInteger(1, testByte)));
		
		String salt = "random";
        byte[] digest = toMD5((str + salt).getBytes("UTF-8"));
        // %x表示返回的是16進制,而32表示16個字節
        System.out.println(String.format("%32x", new BigInteger(1, digest)));
	}
	
	public static byte[] toMD5(byte[] input) {
		MessageDigest md = null;
		try {
			md = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		md.update(input);
		return md.digest();
	}
}

 MD5算法實現:

  輸入:不定長度信息(要加密的信息)

  輸出:固定長度128-bits。由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。

  基本方式爲:求餘、取餘、調整長度、與連接變量進行循環運算。得出結果。

  具體過程請查看MD5算法。算法的的設計目的就是防碰撞,不可逆。

相關文章
相關標籤/搜索