3 回答

TA貢獻1784條經驗 獲得超8個贊
鹽和胡椒粉的要點是增加稱為彩虹表的預先計算的密碼查找的成本。
通常,很難為單個哈希找到沖突(假設哈希是安全的)。但是,如果哈希值很短,則可以使用計算機將所有可能的哈希值生成到硬盤上的查找表中。這稱為彩虹表。如果創建了彩虹表,則可以進入世界,并快速找到任何(未加鹽的未配粉)哈希的合理密碼。
胡椒的重點是使破解您的密碼列表所需的彩虹表獨特。因此,浪費了更多的時間來攻擊者來構建彩虹表。
然而,重點在于使每個用戶的彩虹表對于用戶而言是唯一的,從而進一步增加了攻擊的復雜性。
確實,計算機安全的要點幾乎是從來沒有(在數學上)使其不可能,而在數學和物理上都不可行(例如,在安全系統中,它將利用Universe中的所有熵(甚至更多)來計算單個用戶的密碼)。

TA貢獻1854條經驗 獲得超8個贊
首先,我們應該談一談胡椒粉的確切優點:
Pepper可以保護弱密碼免受字典攻擊,在特殊情況下,攻擊者可以讀取數據庫(包含哈希),但不能訪問Pepper的源代碼。
典型的情況是SQL注入,丟棄備份,丟棄服務器...這些情況并不像聽起來那樣罕見,并且通常不受您的控制(服務器托管)。如果您使用...
每個密碼唯一的鹽
像BCrypt這樣的慢速哈希算法
...強大的密碼受到了很好的保護。在那種情況下,即使知道了鹽,也幾乎不可能強行使用強密碼。問題是弱密碼,它是蠻力字典的一部分,或者是它們的派生產品。字典攻擊將很快顯示出這些信息,因為您僅測試最常用的密碼。
第二個問題是如何使用胡椒粉?
通常推薦的應用胡椒的方法是在將密碼和胡椒傳遞給哈希函數之前,將密碼和胡椒結合起來:
$pepperedPassword = hash_hmac('sha512', $password, $pepper);
$passwordHash = bcrypt($pepperedPassword);
不過,還有另一種更好的方法:
$passwordHash = bcrypt($password);
$encryptedHash = encrypt($passwordHash, $serverSideKey);
這不僅允許添加服務器端機密,還允許交換$ serverSideKey(如果需要)。這種方法需要更多的工作,但是如果代碼一旦存在(庫),則沒有理由不使用它。
添加回答
舉報