我需要對 SRP-6a 進行哪些安全檢查?
我正在實施一個 SRP-6a 登錄系統。我需要做哪些安全檢查?請注意,模數在算法啟動時發送到客戶端。
這是我到目前為止的清單。我使用Wikipedia名稱作為變數。
驗證 $ N $ 是合適的尺寸。
驗證 $ N $ 是素數。
驗證 $ q = \frac{N-1}{2} $ 是素數。
驗證 $ g $ 是一個生成器 $ (\mathbb{Z}/N\mathbb{Z})^\times $ 通過驗證:
- $ 1 < g < N-1 $
- $ g^q = -1 \pmod N $
驗證 $ 0 < A < N $ .
驗證 $ 0 < B < N $ .
驗證 $ u \neq 0 $ .
在客戶端提供其有效證明之前,伺服器不應發送其證明。
關於素數檢查,我應該使用什麼算法?我是否應該在素數檢查期間隨機化參數以防止虛假伺服器找到通過客戶端檢查的組合?
這是一個很好的問題,但我會考慮硬編碼一個已知的好組。讓伺服器決定您是否可以負擔得起使用足夠高的參數值似乎沒有優勢。
SRP 論文列出了以下檢查:
- “n 是一個大的安全素數”(這是你的前三點)
- “g 是 GF(n) 的原始根”(你的下一點)
- “A > 0”(模 n,您可以通過檢查上限來確定)
- “B > 0”(同上)
- “a, b > 日誌$$ g $$n"(缺失)
(最後一點中的排序約束在別處提到。)
你錯過了論文的最後一個,但這不是必需的:
發生這種情況的機率非常小(對於 1024 位 n,小於 2^-1014),但檢查是微不足道的。
您的一項檢查是不必要的:
驗證 $ u \neq 0 $ .
安全散列永遠不會發生這種情況,如果散列允許找到強制執行此操作的輸入,您將遇到更嚴重的問題。(但這是一個快速檢查,所以沒問題。)
關於素數檢查,我應該使用什麼算法?
米勒-拉賓很常見。AKS 在互動式協議中太慢了。如果您必須這樣做,我會遵循FIPS 186 (pdf) 等標準的建議。
我是否應該在素數檢查期間隨機化參數以防止虛假伺服器找到通過客戶端檢查的組合?
Miller-Rabin 無論如何都使用隨機數。此外,通過選擇正確的輪數(見上文),您應該能夠使誤報的機率低到足以使找到一個不可能。