密鑰延伸

在密碼學中 ， 密鑰延伸  技術用以使弱密鑰 （ 通常是用戶口令或密碼短語 ） 更安全 ； 通過增加嘗試每個可能密鑰所需的時間和空間 （ 如果可能 ） 資源 ， 有效阻止蠻力攻擊 （ 暴力破解 ） 。 人們填寫的口令或密碼短語經常太短 ， 或足夠可預測 ， 因而有密碼破解的風險 。 密鑰延伸使得這類攻擊難以進行 ， 原理是使得測試每個密碼的基本步驟更加複雜 。 因爲一個密鑰生成函數必須是確定的 ， 所以弱密碼總是產生相同的延伸後的密鑰 （ 稱爲增強密鑰 ） ， 這種密鑰延伸不改變密鑰空間 （ key - space ） 的熵 ， 僅使計算增強密鑰的方法更復雜 。 對不加鹽密鑰延伸的攻擊是存在的 ， 稱作彩虹表 。 對密鑰加鹽是指在弱密鑰後追加一個長的隨機串 ， 使得預先計算好的散列值不再可用 。 密鑰延伸技術總體上是這樣進行的 ： 輸入初始密鑰到生成增強密鑰的算法 。 得到的增強密鑰應具有足夠長度 （ 比如128位 ） ， 以使其幾乎不可能被暴力破解 。 整個使用的算法應當是安全的 ， 已知不存在用更少處理器資源和內存 （ 相對於使用上述算法本身 ） 即可算出增強密鑰的捷徑 。 密鑰延伸技術留給攻擊者兩個選項 ： 或者嘗試每種可能的增強密鑰組合 （ 只要增強密鑰足夠長 ， 這幾乎不可能達成 ） ， 或者嘗試每個可能的初始密鑰 。 對於後者 ， 如果初始密鑰是口令或者密碼短語 ， 那麼攻擊者首先會嘗試字典中的每個詞或者每個常用密碼 ， 然後對更長的口令嘗試每種字符組合 。 密鑰延伸不杜絕這種方法 ， 但攻擊者的每次嘗試將不得不花費更多資源 （ 時間和使用的內存空間 ） ， 於是這種方法也很容易幾近於不可行 。 攻擊者如果使用和用戶同等級的硬件 ， 每次猜測嘗試將會花費和用戶差不多一樣長的時間 （ 比如一秒鐘 ） 。 即便攻擊者有比用戶更強大的計算資源 ， 密鑰延伸仍然會拖慢攻擊者的速度 ， 同時又不明顯影響合法用戶感知到的系統可用性 ， 因爲用戶在輸入密碼後計算機只需計算一次增強密鑰 ， 而攻擊者攻擊時的每次猜測都必須計算一次 。 有若干方式可以進行密鑰延伸 。 一種是循環重複應用密碼散列函數或塊加密方法 ， 另一種是使用需要大量內存的密碼散列函數 。 加鹽經常與密鑰延伸一同使用 ， 防止攻擊者進行特定的空間換時間 / 時間換空間的攻擊 （ 經常是空間換時間 ， 類似於彩虹表 ） 。 Y