Argon2
在 Argon2 上獨立選擇通道和執行緒參數
我正在研究在 JavaEE 伺服器端應用程序上使用 Argon2。
在 JavaEE 環境中,執行緒應該由應用程序伺服器等管理,我有點不願意將並行度參數設置為大於 1。
一種想法是使用低級 API 並將通道設置為 -let say- 4 並將執行緒設置為 1。
將來,我可以將執行緒設置為 4 以加快速度,或者如果事情進展不順利,我可以恢復為 1 個執行緒。
我已經使用參考實現完成了一些基本範例,並且我已經看到獨立設置通道/執行緒以按預期工作。
是否有任何情況會產生不正確的結果?
在通道上設置高值但不將其與多個執行緒一起使用時,是否存在概念上“錯誤”或“不安全”的問題?比如給攻擊者一些優勢?
提前致謝。
使用更少的執行緒並沒有什麼根本上的錯誤。這確實意味著您可能無法充分利用您擁有的所有記憶體頻寬,導致記憶體填充速度較慢,但不會損壞 Argon2 的記憶體硬度。這對於作為防御者的您來說並不理想,因為並行性並不是要增加您在任何給定時間片中可以執行的操作數量,而是要增加記憶體填充率。x86 CPU 上的單個硬體執行緒即使在其最大時鐘速率下也不會使記憶體匯流排飽和。要做到這一點需要多個核心。事實上,因為填充率很重要,所以在大多數 x86 硬體上使用多個執行緒實際上並不會加快速度!
攻擊者不受計算速率的限制(實際上,Argon2 中的壓縮函式很簡單),而是計算雜湊所需的記憶體總量。強迫他們使用更多的執行單元不會像增加記憶體一樣增加攻擊的總成本。
論文中使用 Intel i7-4500U 處理器的單程 Argon2d 基準測試:
執行緒週期/字節頻寬 (GB/s) 1 1.3 2.5 2 0.9 3.8 4 0.6 5.4 8 0.6 5.4