密鑰延伸

維基百科,自由的百科全書

密碼學中,密鑰延伸(英語:Key stretching)技術用以使弱密鑰(通常是用戶口令密碼短語)更安全;通過增加嘗試每個可能密鑰所需的時間和空間(如果可能)資源,有效阻止蠻力攻擊(暴力破解)。人們填寫的口令或密碼短語經常太短,或足夠可預測,因而有密碼破解的風險。密鑰延伸使得這類攻擊難以進行,原理是使得測試每個密碼的基本步驟更加複雜。因為一個密鑰生成函數必須是確定的,所以弱密碼總是產生相同的延伸後的密鑰(稱為增強密鑰),這種密鑰延伸不改變密鑰空間(key-space)的熵,僅使計算增強密鑰的方法更複雜。對不加鹽密鑰延伸的攻擊是存在的,稱作彩虹表。對密鑰加鹽是指在弱密鑰後追加一個長的隨機串,使得預先計算好的散列值不再可用。

密鑰延伸技術總體上是這樣進行的:輸入初始密鑰到生成增強密鑰的算法。得到的增強密鑰應具有足夠長度(比如128位),以使其幾乎不可能被暴力破解。整個使用的算法應當是安全的,已知不存在用更少處理器資源和內存(相對於使用上述算法本身)即可算出增強密鑰的捷徑。

密鑰延伸技術留給攻擊者兩個選項:或者嘗試每種可能的增強密鑰組合(只要增強密鑰足夠長,這幾乎不可能達成),或者嘗試每個可能的初始密鑰。對於後者,如果初始密鑰是口令或者密碼短語,那麼攻擊者首先會嘗試字典中的每個詞或者每個常用密碼,然後對更長的口令嘗試每種字符組合。密鑰延伸不杜絕這種方法,但攻擊者的每次嘗試將不得不花費更多資源(時間和使用的內存空間),於是這種方法也很容易幾近於不可行。

攻擊者如果使用和用戶同等級的硬體,每次猜測嘗試將會花費和用戶差不多一樣長的時間(比如一秒鐘)。即便攻擊者有比用戶更強大的計算資源,密鑰延伸仍然會拖慢攻擊者的速度,同時又不明顯影響合法用戶感知到的系統可用性,因為用戶在輸入密碼後計算機只需計算一次增強密鑰,而攻擊者攻擊時的每次猜測都必須計算一次。

有若干方式可以進行密鑰延伸。一種是循環重複應用密碼散列函數塊加密方法,另一種是使用需要大量內存的密碼散列函數。

加鹽經常與密鑰延伸一同使用,防止攻擊者進行特定的空間換時間/時間換空間的攻擊(經常是空間換時間,類似於彩虹表)。