哈希算法(Hash function)又稱散列算法,是一種從任何數據(文件、字符等)中創建小的數字“指紋”的方法。哈希算法只需滿足把一個散列對象映射到另一個區間的需求,因此根據使用場景的不同,可將哈希算法分為加密哈希與非加密哈希。
概述
加密哈希被認為是單向函數,也就是說極難由散列函數輸出的結果,回推輸入的數據是什么。加密哈希函數的輸入數據,通常被稱為消息(message),而它的輸出結果通常被稱為摘要(digest)。一個理想的密碼散列函數通常具有以下三個特性:
單向性:極難由一個已知的散列數值,推算出原始的消息;
唯一性:在不改動散列數值的前提下,修改消息內容是不可行的;
抗碰撞性:對于兩個不同的消息,它不能給與相同的散列數值。
其中不可碰撞性是指以當前的算法與算力水平,哈希碰撞的開銷超出人類可以接受的水平。以SHA-256為例,其哈希數值可能性約有1077種,而目前人類估計的宇宙原子總數約1080。雖然有概率論生日悖論問題存在,N位長度的哈希表可能發生碰撞測試次數不是2N次而是只有2N/2次,但仍然是一個巨大的數字。
常見的加密哈希函數有MD5、SHA-1、SHA-2(包含SHA-224、SHA-256、SHA-512等),雖然種類繁多,但除了生成摘要的長度、循環體內容等有一些差異外,算法的基本結構是一致的。下面以SHA-256為例,詳細介紹加密哈希算法的執行步驟。
SHA-256實現原理
常量初始化
SHA-256算法中用到了8個哈希初值以及64個哈希常量,其中,8個哈希初值是對自然數前8個質數(2,3,5,7,11,13,17,19)的平方根的小數部分取前32 bit:
64個哈希常量是對自然數中前64個質數的立方根的小數部分取前32 bit,標記為k[t]:
附加長度值
SHA-256用一個64位的數據來表示原始消息的長度,而在信息處理的過程中給需要將消息分解成512bit大小的塊,因此補位后的消息長度應該是512的整數倍。附加長度值分為兩個步驟:
第一個bit位補1,然后都補0,直到長度滿足對512取模后余數是448,如果長度已經滿足對512取模后余數是448,需要填充512個bit;
附加長度為64bit的長度值。
為什么不可碰撞性對加密哈希算法如此重要?從SHA-256算法的實現步驟可以看出,加密哈希的逆向計算幾乎是不可能的,暴力破解法的成本也太高,因此對加密哈希算法所謂的攻擊實際是利用哈希碰撞為突破口進行數據偽造。以常見的保存用戶密碼為例,如果是明文存儲,一旦發生數據泄露,那么所有的賬戶都會被盜用,因此常用下面一些方法進行Hash加密:
Hash加密:單純對密碼進行Hash加密無法保證密碼的安全性,因為用戶密碼通常是短字符,無論采用哪種加密算法,都可以利用暴力破解或彩虹表攻擊破解。
Hash加鹽:在原消息上添加隨機鹽再進行哈希加密,并將鹽與密碼保存起來,以便下次登陸驗證,添加隨機鹽增加了彩虹表破解的難度,促使攻擊者放棄破解。但是如果對密碼進行不安全的散列函數(MD5)計算,數據庫泄露后,攻擊者可以根據散列值找出碰撞的消息,不管這個消息是否與密碼相同,都可以通過驗證。
專用哈希函數加密:使用bcrypt等專門用來密碼加密的哈希函數進行加密,這類函數通常運算時間較長,大大增加了攻擊成本。
密碼加密不單單是一個技術問題,對于攻擊者來說,如果破解成本大于收益成本,即使攻破了加密的密碼也是無意義的。而那些被證明可以產生散列碰撞的Hash函數,攻擊它們的成本較低,隨著算法的改進與硬件水平的提升,破解的成本也不斷降低。從安全的角度考慮,應該及時更換不安全的哈希算法。
加密哈希的應用比較廣泛,筆者詳細地學習哈希算法的實現原理,也是為了更好地理解它們使用與被攻擊的方式,而不僅僅是在編程中調一個函數庫。在這之前以為密碼學的知識比較晦澀難懂,實際上拋開中間的數學運算,整體的邏輯十分清晰,基本結構很容易理解。
審核編輯:符乾江
-
數據
+關注
關注
8文章
7145瀏覽量
89582 -
哈希算法
+關注
關注
1文章
56瀏覽量
10779
發布評論請先 登錄
相關推薦
評論