Symmetric

如何為密碼庫選擇 Argon2 的參數

  • August 8, 2021

我正在創建一個密碼庫,我計劃使用Argon2id從主密碼中派生主密鑰。對於加密,我計劃將XChaCha20 與 Poly1305一起使用。

需要明確的是:一組多個密碼和使用者名將使用 XChaCha20 加密並使用 Poly1305 進行身份驗證,使用(隨機 192 位 IV 和)從使用 Argon2id 的主密碼派生的 256 位密鑰(嘗試同時使用的版本)抵抗 GPU 破解攻擊和側通道攻擊)(使用 256 位安全隨機鹽;雖然我實際上可能使用 128 位鹽,因為這也應該足夠了)。(如果此設置有任何問題,例如使用 Argon2 的 id 版本或使用 XChaCha20,也請告訴我,但我認為這些應該是合適的。)最終,我想讓密碼庫在兩個桌面上都可用(/筆記型電腦)和移動設備。

現在我想確定適用於現代手機和標準電腦的 Argon2id 的良好安全但不過度殺傷的預設參數。選擇的參數如下:

  • 時間成本(迭代次數)
  • 記憶體成本(要使用的 KiB 數量)
  • 並行度(要使用的執行緒數;也會影響輸出)

Argon2 RFC v12 草案告訴我們首先選擇您可以承受的最大並行度和記憶體成本,並增加時間成本,直到函式花費的時間超出您的承受能力。(2021 年編輯:顯然,v13現在建議並行度為 4。)

另一個頁面引用了多個來源,例如libsodium文件,其中有多個建議

  • “用於互動式、線上操作,crypto_pwhash_OPSLIMIT_INTERACTIVEcrypto_pwhash_MEMLIMIT_INTERACTIVE為這兩個參數提供基線”

  • “可替代,crypto_pwhash_OPSLIMIT_MODERATE並且crypto_pwhash_MEMLIMIT_MODERATE可以使用”

    • 目前 3 次迭代和 256 MiB RAM
  • “對於高度敏感的數據和非互動操作,crypto_pwhash_OPSLIMIT_SENSITIVE可以crypto_pwhash_MEMLIMIT_SENSITIVE使用”

    • 目前 4 次迭代和 1 GiB RAM

(在所有情況下,只使用一個執行緒。)

我筆記型電腦上的一個快速基準測試告訴我,使用最後一組參數(使用原始 Argon2id 實現),該函式只需要 3.9 秒,我認為這是完全可以接受的,因為我更喜歡擁有一個安全的系統。但是,在我的手機上這需要 8 秒(使用argon2kt),這比我希望的要長一點,更不用說 1 GiB 是相當多的記憶體。

作為參考,我查看了密碼庫KeePass的原始碼,似乎他們使用 Argon2d(因此側通道保護較少)進行 2 次迭代,預設情況下只有 1 MiB記憶體(但 2 個執行緒):[摘自KeePassLib.Cryptography.KeyDerivation.Argon2Kdf: ]

internal const ulong DefaultIterations = 2;
internal const ulong DefaultMemory = 1024 * 1024; // 1 MB
internal const uint DefaultParallelism = 2;

只是我,還是有點不安全?

另外,並行參數在反攻擊中起什麼作用?這不重要嗎,因為 libsodium 只是將其保持在 1?

總之,我認為這有點含糊,我想為這 3 個參數設置一些最小安全值,因為如果我使用小參數,因為我的手機速度很慢,而攻擊者有一堆 GPU?那我的保險庫就完全沒用了。另外,我想一個人可能會過火併選擇比必要的值更大的值。是否有一些限制,之後直接破解對稱密鑰比猜測密碼更快?

並行性可能是 Argon2 贏得密碼雜湊競賽的原因之一。處理器核心的使用允許更大的記憶體硬度(安全性),而不會相應地增加執行時間。缺點是開發人員從那時起一直想知道他們的應用程序有什麼價值。

並行度取決於可用核心的數量。如果您希望您的應用程序在不同的設備上執行,則執行時間會隨著更高的並行係數而有很大差異。截至那時,大約 50% 的人在他們的電腦中安裝了四核處理器。這將建議將並行係數增加到 8(核心數量的兩倍),但對於具有單核的智能手機,這將大約使執行時間增加四倍。

對此沒有明確的解決方案。我個人覺得 libsodium 的選擇過於極端,儘管它很可能是跨設備的。但是您因此錯過了 Argon2 的主要優勢。

如果您假設絕大多數使用者至少有兩個處理器核心,您可以將並行度因子設置為 4,如果您更加小心,則可以設置為 2。然後您可以設置假定的可用記憶體(沒有明確的解決方案這也是,至少 64 MiB?),最後設置執行時間可能是一秒的時間因素。

引用自:https://crypto.stackexchange.com/questions/84081