Key-Derivation
bcrypt 比 GnuPG 的迭代+加鹽散列方法更好嗎?
GnuPG 以iterated+salted S2K的形式內置了慢速雜湊。
與 bcrypt 或 scrypt 相比,它有缺點嗎?GnuPG 的慢速散列方法在 GPU 中是否容易自動化?
OpenPGP 的“迭代和加鹽 S2K”只是一個非常長的輸入上的單個雜湊實例,它包含鹽和密碼的重複連接。這對 GPU 非常友好,尤其是在使用基於 32 位基本運算的雜湊函式時(此類別包括 MD5、SHA-1、SHA-256 和 RIPEMD-160;GPU 不擅長處理 64-位操作,例如 SHA-512)。因此,攻擊者在嘗試攻擊已使用該密鑰派生函式處理的密碼時,將從 GPU 中獲得很好的提升。
請注意,這將 S2K 與PBKDF2歸為同一類別:儘管它們的內部結構有很大不同,但它們在硬體上具有相似的使用模式。相比之下,bcrypt 和 scrypt 需要更快的訪問 RAM,這使 GPU 處於劣勢。Bcrypt 仍然適合幾千字節的 RAM,因此仍然容易通過 FPGA 進行優化;scrypt 看起來更好,但它很閃亮,因為它是新的,這在密碼系統中不是一件好事(就像好酒一樣,好的密碼必須等待幾年才能獲得最佳質量;請參閱這個答案以獲得更徹底的討論)。
讓我強調一下,實際上,OpenPGP 的 S2K(或者,就此而言,PBKDF2)很少會成為給定係統中最薄弱的部分。儘管存在所有缺點,但 S2K比簡單的非迭代 hash-with-salt 和更不用說unsalted 的 hash 呼叫要好得多,不幸的是,在部署的應用程序中仍然經常遇到這種情況。