作為通信工程的學生,我在學習《信息論與編碼》這門課的時候了解過關於加密解密的一些知識,但覺得不夠深入,不甚過癮。
這幾天學習了跟密碼學有很大關聯的哈希算法,跟大家分享一下。
哈希算法是什么
哈希,英文為Hash,有時翻譯為散列,所以哈希函數又叫做散列函數。度娘的解釋是“
哈希函數的運算結果就是哈希值,通常簡稱為哈希。
哈希算法的特點
哈希算法應該具備三個基本點:
1.獨一無二,兩個不同的數據,要有不相同的哈希
2.安全,給定數據M容易算出哈希值X,給定X不可算出M(單向算法)
3.長度固定,給定一種哈希算法,不管輸入多大數據,輸出長度固定
*當然,安全性只是相對而言,因為輸入取值范圍無限而哈希長度固定的話,如果輸入足夠龐大,肯定會找到兩個一樣的哈希值
假如出現了兩個不同輸入有相同輸出的情況,稱為碰撞(collision)。不同的哈希算法,位數越多,則安全級別越高,或者說抗碰撞性越好。
哈希算法的作用
哈希的獨一無二保證了:如果數據在存儲或傳輸過程中有絲毫損壞,那它的哈希就會改變。哈希函數最常見的一個作用就是進行完整性校驗(Integrity Check),完成即數據無損壞。哈希函數的基本作用是給大數據算出一個摘要性的長度固定的字符,即哈希。
哈希也可以叫做Checksum(校驗值)、Digest(摘要)、Fingerprint(指紋),大抵是一個意思:哈希可以代表數據本身。
哈希算法的分類與區別
總體上分為兩類:普通哈希;加密哈希(cryptographic hash function)
加密哈希跟普通哈希的區別就是安全性,一般原則是只要一種哈希算法出現過碰撞,就會不被推薦成為加密哈希了,只有安全度高的哈希算法才能用作加密哈希。
在密碼學領域,有兩個算法都是把數據做輸入,而輸出是一段誰也看不懂的數據。其中一個就是哈希算法,另外一個是加密算法。注意,哈希算法和加密算法是完全不同的。
哈希算法的輸出長度是固定的,而加密算法的輸出長度是跟數據本身長度直接相關的。
哈希是不可以逆向運算出數據的,而加密算法的輸出是要能夠逆向運算出數據的。
這里主要是強調加密哈希算法只是被用在加密過程中,但是它本身不是加密算法。
哈希算法的應用
主要應用大場景有兩個:
1、網站注冊
2、區塊鏈和加密貨幣
哈希的基本作用就是提供一個數據的摘要或者指紋,通常的使用場景就是完整性校驗。哈希算法有很多種,一般來講哈希越長的算法,安全性也就越高,安全度足夠高的哈希,或者說沒有任何人能夠成功實現碰撞的哈希,才有資格被考慮用在加密場合,而這類的哈希算法也被叫做加密哈希算法。