介紹
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來保存用戶的密碼(常用)
為了保護賬號安全,所有網站都不會保存用戶的密碼明文,而是用哈希加密演算法對密碼進行計算,將得到的哈希串保存在資料庫中,每次用戶登陸時會將用戶提交的密碼用同樣的演算法計算,并將結果與資料庫中保存的哈希串比對以驗證用戶身份
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227182.html
標籤:其他
