2016012023李偉 散列函數的應用及其安全性
一、散列函數的具體應用
加密
一個典型的加密單向函數是“非對稱”的,並且由一個高效的散列函數構成;一個典型的加密暗門函數是“對稱”的,並且由一個高效的隨機函數構成。
確保傳遞真實的信息
消息或數據的接受者確認消息是否被篡改的性質叫數據的真實性,也稱為完整性。發信人通過將原消息和散列值一起發送,可以保證真實性。
散列表
散列表是散列函數的一個主要應用,使用散列表能夠快速的按照關鍵字查找數據記錄。例如,在英語字典中的關鍵字是英文單詞,和它們相關的記錄包含這些單詞的定義。在這種情況下,散列函數必須把按照字母順序排列的字符串映射到為散列表的內部數組所創建的索引上。
散列表散列函數的幾乎不可能/不切實際的理想是把每個關鍵字映射到唯一的索引上,因為這樣能夠保證直接訪問表中的每一個數據。
一個好的散列函數(包括大多數加密散列函數)具有均勻的真正隨機輸出,因而平均只需要一兩次探測(依賴於裝填因子)就能找到目標。同樣重要的是,隨機散列函數不太會出現非常高的沖突率。但是,少量的可以估計的沖突在實際狀況下是不可避免的(參考生日悖論或鴿洞原理)。
錯誤校正與檢測
使用一個散列函數可以很直觀的檢測出數據在傳輸時發生的錯誤。在數據的發送方,對將要發送的數據應用散列函數,並將計算的結果同原始數據一同發送。在數據的接收方,同樣的散列函數被再一次應用到接收到的數據上,如果兩次散列函數計算出來的結果不一致,那麽就說明數據在傳輸的過程中某些地方有錯誤了。這就叫做冗余校驗。
Rabin-Karp字符串搜索算法
Rabin-Karp字符串搜索算法是一個相對快速的字符串搜索算法,它所需要的平均搜索時間是O(n).這個算法是創建在使用散列來比較字符串的基礎上的。
二、散列函數的安全性以及目前安全散列函數的發展
安全散列算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼散列函數家族,是FIPS所認證的安全散列算法。能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應到不同字符串的機率很高。
散列函數的安全性
2004年8月17日,在 CRYPTO 2004的Rump會議上,王小雲,馮登國(Feng)、來學嘉(Lai),和於紅波(Yu)宣布了攻擊MD5、SHA-0和其他散列函數的初步結果。他 們攻擊SHA-0的計算復雜度是240,這意謂的他們的攻擊成果比Joux還有其他人所做的更好。請參見MD5安全性。2005年二月,王小雲和殷益群、 於紅波再度發表了對SHA-0破密的算法,可在239的計算復雜度內就找到碰撞。
2005年二月,王小雲、殷益群及於紅波發表了對完整版SHA-1的攻擊,只需少於269的計算復雜度,就能找到一組碰撞。(利用生日攻擊法找到碰撞需要280的計算復雜度。)
(生日攻擊(Birthday Attack):根據抽屜原理,一個屋子裏必須有366個人(一年有365天,不考慮閏年)才能保證一定有2個人生日相同。然而,如果一個屋子裏有23個人,則有50%的概率2個人生日相同。密碼學上認為,如果能找到一種方法,能在計算時間小於2^{80}的情況下,有超過生日攻擊的概率下找到一組碰撞,則認為這個哈希函數就不安全了。)
這 篇論文的作者們寫道;“我們的破密分析是以對付SHA-0的差分攻擊、近似碰撞、多區塊碰撞技術、以及從MD5算法中查找碰撞的消息更改技術為基礎。沒有 這些強力的分析工具,SHA-1就無法破解。”此外,作者還展示了一次對58次加密循環SHA-1的破密,在233個單位操作內就找到一組碰撞。完整攻擊 方法的論文發表在2005年八月的CRYPTO會議中。
殷益群在一次面談中如此陳述:“大致上來說,我們找到了兩個弱點:其一是前置處理不夠復雜;其二是前20個循環中的某些數學運算會造成不可預期的安全性問題。”
2005年8月17日的CRYPTO會議尾聲中王小雲、姚期智、姚儲楓再度發表更有效率的SHA-1攻擊法,能在263個計算復雜度內找到碰撞。
碰撞攻擊、原象攻擊、生日攻擊、暴力破解、彩虹表、旁路攻擊、長度擴展攻擊
MD5,SHA1,SHA256不是用來保存密碼用的, 是用來校驗數據完整性用的
散列函數的發展
SHA-0:1993年發布,當時稱做安全散列標準(Secure Hash Standard),發布之後很快就被NSA撤回,是SHA-1的前身。
SHA-1:1995年發布,SHA-1在許多安全協議中廣為使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被視為是MD5(更早之前被廣為使用的散列函數)的後繼者。但SHA-1的安全性在2000年以後已經不被大多數的加密場景所接受。2017年荷蘭密碼學研究小組CWI和Google正式宣布攻破了SHA-1[1]。
SHA-2:2001年發布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。雖然至今尚未出現對SHA-2有效的攻擊,它的算法跟SHA-1基本上仍然相似;因此有些人開始發展其他替代的散列算法。
SHA-3:2015年正式發布,SHA-3並不是要取代SHA-2,因為SHA-2目前並沒有出現明顯的弱點。由於對MD5出現成功的破解,以及對SHA-0和SHA-1出現理論上破解的方法,NIST感覺需要一個與之前算法不同的,可替換的加密散列算法,也就是現在的SHA-3。
SHA-1在許多安全協議中廣為使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被視為是MD5(更早之前被廣為使用的散列函數)的後繼者。但SHA-1的安全性如今被密碼學家嚴重質疑;雖然至今尚未出現對SHA-2有效的攻擊,它的算法跟SHA-1基本上仍然相似;因此有些人開始發展其他替代的散列算法。
三、md5算法在驗證軟件完整性時可能出現的問題
早期的碰撞樣本,主要采用“前綴構造法”,以同一個給定的前綴程序A為基礎,在尾部添加不同的附加數據,得到兩個具有相同MD5的樣本B和C。前綴構造法碰撞後的兩個樣本只有尾部少量字節不同,而程序代碼是相同的。通過判斷尾部數據的差異,兩個樣本可以執行不同的程序流程。由於這種碰撞手法是通過同一前綴程序碰撞生成的兩個樣本,如果其中有惡意代碼流程則兩個樣本均包含惡意代碼,所以比較容易被安全軟件識別,隱蔽性較差。
選擇前綴攻擊則是構造兩個不同的消息s1和s2,他們不必有共同的前綴,但是經過在尾部附加不同的“碰撞塊”後,兩個消息的散列值相同。選擇前綴攻擊是包括共同前綴攻擊的,因此共同前綴的攻擊代價小於選擇前綴攻擊。對於兩個給定的不同前綴p1和p2,CPC攻擊可以構造出兩個後綴m1和m2,使得
hash(p1+m1) = hash(p2+m2)
而且p1+m1的長度和p2+m2的長度相等。
舉個例子,令p1=“希拉裏會當選”,p2=“川普會當選”。在大選之前先利用CPC攻擊,構造出兩個後綴m1和m2,然後計算他們的MD5值v=MD5(p1+m1)=MD5(p2+m2)。然後告訴世人本次大選結果的md5值是v。在真正結果揭曉後,若希拉裏當選,則展示p1+m1,否則展示p2+m2,即可完成預測。當然實際場景下沒有那麽簡單,任何人看到“XXX當選”後面那串毫無意義的後綴字串都會產生質疑。在實際攻擊場景中往往需要一個可以在末尾附加額外數據的數據結構上進行CPC攻擊,例如PE可執行文件、ZIP壓縮文件、JPG圖像文件等末尾都可以加入後綴且不影響正常使用。利用CPC攻擊,還可以構造多個消息的碰撞。
helloworld.exe和goodbyworld.exe這兩個程序會在屏幕上打印出不同的字符,但是它們的 MD5 都是一樣的,卻又都能正常運行,並且可以做完全不同的事情。
MD5 算法不應再被用於任何軟件完整性檢查或代碼簽名的用途。
2016012023李偉 散列函數的應用及其安全性