散列函數是一種公開的數學函數。散列函數運算的輸入信息也可叫作報文。散列函數運算后所得到的結果叫作散列碼或者叫作消息摘要。散列函數具有如下一些特點:
(1)不同內容的報文具有不同的散列碼,而一旦原始報文有任何改變,哪怕改變一位信息,則通過散列函數計算后得到的散列碼也將完全不同。這樣,這個散列碼就好比是這個報文所特有的“指紋”。
(2)散列函數是單向的,即求解某一個報文的散列碼非常容易,但是根據散列碼來倒推原始報文是非常困難的。
(3)對于任何一個報文,無法預知它的散列碼。
(4)散列碼具有固定的長度,不管原始報文的長度如何,通過散列函數運算后的散列碼都具有一樣的長度。例如,MD5(Message Digest Algorithm 5,消息摘要算法第 5 個版本)散列算法的散列碼長度為 128 位,并且不管是對一部百科全書,還是對某個人的工資進行 MD5 散列運算,得到的散列碼長度都是 128 位。
由于散列函數具有這些特征,因此散列函數可以用來檢測報文的可靠性。接收者對收到的報文用與發送者相同的散列函數進行運算,如果得到與發送者相同的散列碼,則可以認為報文沒有被篡改,否則,報文就是不可信的。
常見的散列函數有 MD5、SHA、HMAC 等。MD5 是一種非常著名的散列算法,已經成為國際標準,具有很好的安全性能。MD5 算法在對輸入的報文進行計算時,是以 512 位為單位進行處理的,結果生成一個 128 位長的消息摘要;SHA、HMAC 等算法都是對任意長度的報文以 512 位為單位進行處理,最后得出一個 160 位的消息摘要。