介紹
hash算法,又稱哈希或雜湊演算法,它能将任意長度的二進制值映射為較短的固定長度的二進制值,即hash值。并且不同的明文很難映射為相同的hash值。hash值在應用中又稱為數字指紋(fingerprint)、數字摘要(digest)或者消息摘要
一個優秀的hash算法,具有如下特點:
- 正向快速:給定明文和hash算法,在有限時間和有限資源内能計算出hash值
- 逆向困難:給定(若幹)hash值,在有限時間内很難(基本不可能)逆推明文
- 輸入敏感:原始輸入資訊修改一點資訊,産生的hash值看起來應該都有很大不同
- 抗沖突(抗碰撞性)
對不同的關鍵字可能得到同一hash值,或者說兩段内容不同的明文,它們的hash值可能一緻,這種現象稱沖突或者碰撞
抗沖突又稱為“抗碰撞性”或沖突避免。哈希函數抗沖突就是不同的輸入不能産生相同的輸出
抗沖突并不是不會有沖突,隻不過找到有沖突的兩個輸入的代價非常大
目前流行的hash算法
- MD4(message digest):輸出為128位二進制 - 16位元組
- MD5:輸出為128位二進制
- SHA-1(secure hash algorithm - 1):加密雜湊演算法;輸出為160位二進制值
- SHA-2(secure hash - 2):SHA-224、SHA-256(256的二進制、64位的16進制,比特币常用)、SHA-384、SHA-512
- SHA-3,之前名為keccak算法,是一個加密雜湊算法
- Keccak的輸出長度分别有:512、384、256、224
- SHA-3并不是要取代SHA-2,因為SHA-2目前并沒有出現明顯的弱點
- 由于對MD5出現成功的破解,以及對SHA-1出現理論上破解的方法,NIST感覺需要一個與之前算法不同的,可替換的加密雜湊算法,也就是現在的SHA-3
- RIPEMD-160(RACE完整的原始評估資訊摘要):是一個160位的加密哈希函數,旨在替換128位哈希函數MD4、MD5
破解的方法
- 尋找碰撞法(無應用價值)
- 窮舉法:耗時,需大量計算
- 密碼字典暴力破解:耗費存儲空間
- 彩虹表攻擊
- 彩虹表其實是窮舉法和密碼字典方法的折衷,将耗時和占用空間控制在可接受的範圍内
防禦方法
防禦方法:加鹽。即在密碼的特定位置插入特定的字元串,這個特定字元串就是“鹽”,加鹽後的密碼經過哈希加密得到的哈希串與加鹽前的哈希串完全不同,黑客用彩虹表得到的密碼根本就不是真正的密碼。即時黑客知道了“鹽”的内容、加鹽的位置,還需要重新生成彩虹表,是以加鹽能大大增加利用彩虹表攻擊的難度
注意
- 一般認為MD5和SHA1已經不夠安全,不具備“強抗碰撞性”,推薦至少使用SHA-256算法
- 主流的web開發依然使用md5來儲存使用者的密碼(常用)
為了保護賬号安全,所有網站都不會儲存使用者的密碼明文,而是用哈希加密算法對密碼進行計算,将得到的哈希串儲存在資料庫中,每次使用者登陸時會将使用者送出的密碼用同樣的算法計算,并将結果與資料庫中儲存的哈希串比對以驗證使用者身份