Hash

我應該計算令牌原始字節的 SHA-256 雜湊還是十六進制編碼?

  • February 12, 2021

我有一個系統,我應該為使用者生成一個秘密令牌。令牌的存在足以授予對某些使用者相關數據的訪問權限。

我正在從加密安全的隨機數生成器生成 4096 位令牌。在內部,我將令牌作為字元串處理,編碼為十六進制。令牌使用 SHA-256 進行雜湊處理,並儲存在數據庫中,表示令牌的十六進製字元串被發送給使用者並且從不儲存。

當使用者提供令牌的十六進製字元串時,我計算它的 SHA-256 雜湊並查找它。


問題是:我是否通過計算十六進制編碼字元串的 SHA-256 與計算原始字節有效負載的雜湊值來犧牲一些東西?我在 Go 中寫這個,所以我真的在計算 SHA-256 雜湊,[]byte(str)它將字元串轉換為字節數組。

我有這種感覺,我可能正在將蘋果與橙子與甜瓜進行比較。

我是否應該從使用者那裡獲取十六進制編碼的字元串,將其轉換為字節數組,使用 SHA-256 對其進行雜湊處理,然後使用它?

問題 1-a:如果它是 base64url 而不是十六進制,情況會改變嗎?

編碼不會改變熵源的輸出。它們是可逆的操作。您可以使用適合您的編碼,更改為 base64 進行傳輸並在數據庫上使用強,更改為字節是一個不錯的選擇,因為通常加密雜湊函式接受字節來處理,因此最好將它們轉換為字節在應用 SHA-256 之前,您可以從 SHA-256 的速度中受益。Base64 或 Hex 可能會因為長度的增加而需要更多的時間來散列相同的數據,即 $ ~3n/4 $ 在 Base64 中,和 $ 2n $ 十六進制 $ n $ 字節。

如果 CSPRNG 具有良好的熵,那麼您甚至不需要 SHA-256 或至少 4096 位令牌,對源的輸出進行散列處理是一個好主意,但是,如果源需要 4096 位來產生良好的 256 -位隨機性,那裡可能有問題。但是,這實際上取決於您的 CSPRNG。

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