生成 OAuth 令牌的算法
我正在嘗試找到一種用於在 API 中生成授權程式碼、訪問令牌和刷新令牌的好算法。
目前,我正在研究以下設置:
令牌是使用
RNGCryptoServiceProvider
C# 中的類生成的。(我已將允許的字元限制為以下集合abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-
:)生成的授權碼長度為 256 位,有效期為 5 分鐘。訪問令牌的生成長度為 512 位,有效期為 1 小時。刷新令牌的生成長度為 2048 位,有效期為 60 天。
這些程式碼和令牌然後用隨機的 64 位鹽加鹽,然後
SHA-256
在儲存到數據庫之前使用散列。考慮到所使用的令牌生命週期、鹽和散列算法,這是一個合理的安全設置嗎?
您的設置是安全的。然而,它在很大程度上是“不必要的”安全的。
首先是生成方法:您使用的是 RNG-CSP,它是(我猜)微軟與 Windows 安全 PRNG 的軟體介面,所以這很好。
現在為您的令牌:
您正在限製字元集,這會減少每字節可能的熵,但如果您在 Web 上下文中,那就沒問題了。請注意,您“只有”每個字節(8 位)大約有 6 位熵。
但是,您的令牌太大。標準安全級別是 128、192 和 256 位安全,只要我們被困在太陽系中並且除了太陽之外沒有發現任何奇特的能源,256 就被認為是安全的。您目前的令牌大小提供 192、384 和 1536 位安全性,這在後兩種情況下太大了。我建議將令牌的長度更改為 384 位。如果你想,
您對散列的選擇很好,SHA-256 提供 256 位預映像電阻,這正是您想要的。如果您希望針對量子電腦擁有超過 128 位的安全性,則更大的雜湊函式可能是您的選擇,這需要您使用 SHA(-3)-512
TL;DR:長令牌可能會縮短到 384 / 256 位長度,其餘的都可以。