散列是從某個位字符串(通常是可變長度)到另一個位字符串(通常是較小且具有固定長度)的函數。
散列用於數據庫中的數據檢索以及in-內存數據結構稱為哈希表。它使我們能夠將任意數據(例如字符串或具有多個字段的複雜對象)簡化為二進制數,然後可以將其直接用作稀疏數組的索引以獲取關聯的數據(具有一些用於處理哈希的詳細信息)
以上述方式使用的哈希函數是密碼哈希函數的“表親”。它們針對不同的要求而設計。它們必須快速計算並獲得良好的分佈。
在安全計算中,使用加密哈希將數據消化為一些有代表性的小比特串。密碼功能有不同的要求。它們被設計成難以反轉(成為“活板門”或“單向”功能)。不僅如此,一個重要的要求是,對於給定的純文本和哈希值,必須很難找到另一個產生相同哈希的純文本。
哈希不僅可以用於密碼,但作為校驗和以驗證數據完整性,也作為數字簽名實施的一部分。要對大型文檔進行數字簽名,我們只需要對文檔進行哈希處理就可以產生一個“摘要”(當對很長的內容進行哈希處理時,該名稱用於哈希函數的輸出)。然後,僅將此摘要通過公鑰密碼系統生成簽名。您可以在其中看到缺點:如果攻擊者成功生成摘要相同的文檔,該怎麼辦?然後,看起來好像是在真實文件上產生的原始簽名實際上是偽造文件的簽名:簽名轉移偽造已得到有效實施。
密碼哈希允許系統不存儲密碼的純文本版本,但使系統能夠驗證試圖獲得輸入的用戶是否知道該密碼。散列不僅允許系統不存儲純文本密碼(必須非常謹慎地加以保護),而且還允許即使散列是公開公開的,密碼仍然是安全的(類似於公鑰加密方式)系統能夠公開公鑰)。儘管在實踐中,哈希仍然受到公共訪問的保護:例如,在類Unix系統上的 / etc / shadow
文件,補充了世界可讀的 / etc / passwd
文件。 / p>
散列函數不是隨機的。但是,可以採用隨機方法來阻止攻擊者建立大量的密碼和哈希字典,使他們能夠查找哈希碼並檢索相應的密碼。
要更安全地哈希密碼,我們可以簡單地添加它的一些隨機位稱為“鹽”。當然,將不同的鹽添加到同一密碼中會導致產生不同的哈希值(希望衝突很少或沒有衝突)。
如果隨機鹽的寬度為32位,那麼從理論上講,這意味著一個密碼可以以40億種不同的方式進行哈希處理,因此,預先計算所有可能的哈希值的字典非常不切實際
當然,當用戶通過身份驗證時,她對這種鹽一無所知。可以,因為鹽與哈希一起存儲在用戶的配置文件中(通常與哈希一起存儲在單個緊湊的位串中)。驗證用戶的密碼輸入後,會將鹽添加到她輸入的任何密碼中,以便使用正確的鹽進行哈希處理。如果密碼正確,則哈希將匹配,因為使用的鹽也是正確的,已從用戶的配置文件中提取出來。
這就是將隨機性結合到密碼哈希中的方式,同時仍然允許它起作用。
讓哈希難以破解的原因是哈希是由“陷阱門”或“單向”功能構建的。在數學中,有很多這樣的例子。例如,簡單的加法就是活板門。如果我們加一些整數來產生一個總和,就不可能只知道總和就恢復原始數字。
密碼散列不是加密的密碼。如果攻擊者擁有密碼的哈希值和鹽值,並且碰巧猜出了密碼,那麼她可以輕鬆地確認身份,就像登錄驗證器軟件所做的一樣:她通過哈希函數運行密碼加鹽值,然後看到正確的哈希出現了。