Argon2id 內部迭代與多次 Argon2id 呼叫?
TLDR;如果不是將迭代參數設置為 12(例如),而是將其設置為 3,但呼叫該函式 4 次,是否存在安全風險?
我問這個有兩個原因:
首先,我們使用 SRP 協議,其中不推薦使用的 SHA1 在我們的 PWA(漸進式 Web 應用程序,因此在 JavaScript 中)中替換為 Argon2id,但 Firefox 和Google 目前正在討論在操作佔用過多 CPU 或 RAM 時通知使用者。他們的目標是打擊在後台進行比特幣挖礦的網站。我不希望每次我們使用 Argon2 時都需要使用者確認。
其次,由於我們無法在 JavaScript 中知道智能手機可用的 CPU/RAM,我們無法知道理想的迭代次數,因此我們需要藉助計時器來找到它,我們可以呼叫Argon2id 盡可能多的時間,直到 3 秒過去。當然,我們還會將第一次使用的呼叫次數保存在記憶體中,以便下次我們要比較時執行完全相同的呼叫次數。
順便說一句,2017 年 1 月的最後一個RFC 8018仍然推薦 PBKDF2,並且這個 KDF 在瀏覽器(WebCrypto API)中得到原生支持,並且比任何外部庫都快,所以解決方案可能是不使用 Argon2 並使用 WebCrypto PBKDF2,具有相同的多次呼叫的方法,直到 3 秒過去?
我在這裡添加我的解決方案以供記錄。
與其在使用者登錄時多次呼叫 Argon2d 函式,我們可以做一些更聰明的事情,在使用者註冊時研究最佳設置。
我們可以通知他我們將需要幾秒鐘來調整安全性,而 5~10 秒。因此,如果瀏覽器阻止該過程並警告使用者,他已經被告知並可以繼續該過程。
從技術上講,我們從較低的值(1MB / 1 次迭代)嘗試不同的設置,直到測量的延遲至少需要 1 秒。然後,我們可以保存用於該使用者設備的設置。當使用者登錄時,我們只需使用相關的設置,這不會超過 1~2 秒。所以理論上這不應該被瀏覽器阻止,我們在跟踪設備功能時增加了安全性。
一些真實的測試:
- 蘋果 iPhone 4S (512MB - 1Ghz): ~1.7s ==> m=1MB,t=1
- 蘋果 iPhone 5(1GB - 1.3Ghz 雙核):~1.2s ==> m=4MB,t=1
- 三星 S8(4 GB,2.3GHz / 1.7GHz 四核):~1.4s ==> m=24MB,t=2
- NUC i3(8GB - 1.7Ghz 四核):~1.4s ==> m=24MB,t=2
歡迎任何回饋。