消息摘要及其算法掃盲貼

消息摘要算法的主要特點有:

1、無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。例如應用MD5算法摘要的消息有128個比特位,用SHA-1算法摘要的消息最終有160比特位的輸出,SHA-1的變體可以產生192比特位和256比特位的消息摘要。一般認爲,摘要的最終輸出越長,該摘要算法就越安全。變長輸入,定長輸出


2、只要輸入的消息不同,對其進行摘要以後產生的摘要消息也必不相同;但相同的輸入必會產生相同的輸出。這正是好的消息摘要算法所具有的性質:輸入改變了,輸出也就改變了;兩條相似的消息的摘要確不相近,甚至會大相徑庭。從理論上來說,不管使用什麼樣的摘要算法,必然存在2個不同的消息,對應同樣的摘要。因爲輸入是一個無窮集合,而輸出是一個有限集合,所以從數學上來說,必然存在多對一的關係。但是實際上,很難或者說根本不可能人爲的造出具有同樣摘要的2個不同消息。所以我們選擇摘要算法的時候,要注意其安全性。比如現在MD5就是不安全的,已經被國內王小云破解。


3、消息摘要是單向、不可逆的。只能進行正向的信息摘要,而無法從摘要中恢復出任何的原始消息,甚至根本就找不到任何與原信息相關的信息。當然,可以採用強力攻擊的方法,即嘗試每一個可能的信息,計算其摘要,看看是否與已有的摘要相同,如果這樣做,最終肯定會恢復出摘要的消息。但實際上,要得到的信息可能是無窮個消息之一,所以這種強力攻擊幾乎是無效的。


4、好的摘要算法,沒有人能從中找到“碰撞”,雖然“碰撞”是肯定存在的。即無法找到兩條不同消息,但是它們的摘要相同。


JDK自帶了很多常見的消息摘要算法,使用方式如下:

import java.security.MessageDigest;
import java.security.Security;
import java.util.Set;

import javax.xml.bind.DatatypeConverter;

public class Test {
	public static void main(String[] args) throws Exception {
		String originalContent = "123456";
		Set<String> availableAlgorithms = Security.getAlgorithms("MessageDigest");
		for (String each : availableAlgorithms) {
			digest(each, originalContent.getBytes());
		}

	}

	private static void digest(String algorithm, byte[] content) throws Exception {
		MessageDigest instance = MessageDigest.getInstance(algorithm);
		instance.update(content);
		//當所有數據已被更新,調用digest()方法完成哈希計算,返回字節數組
		byte[] digest = instance.digest();
		System.out.println("算法=" + algorithm + ",摘要=" + DatatypeConverter.printHexBinary(digest));
	}
}


我們可以隨便找一個文件,用好壓可以計算其MD5值,然後我們通過代碼自己計算,看看是否相同。好壓計算MD5使用方式和輸出結果如下:




通過下面的java程序計算MD5:


可以看到2種方式得到的文件MD5值是一樣的,因爲大家用的都是公開的MD5加密算法。


消息摘要有什麼用呢?消息摘要保證了消息的完整性。如果發送者發送的消息,在傳輸過程中被惡意篡改,那麼接收者收到消息後,用同樣的摘要算法計算其摘要,如果新摘要與發送者原始摘要不同,那麼接收者就知道消息被篡改了。這裏有一個前提條件就是:接收者一定要事先知道消息的原始摘要。消息摘要不需要祕鑰,不存在祕鑰的保管和分發問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章