通過附加 HMAC 雜湊來保護 http 會話 ID?
首先,如果這個問題與此處定義的主題無關,我深表歉意。如果是這樣,請告訴我,我會關閉它。
我正在為 http 服務建構會話中間件,並認為附加會話 id 的 hmac 雜湊值可能是個好主意,而不是在 cookie 中設置裸會話 id,但我有點加密新手。僅供參考 - 該服務沒有保護任何重要的東西,它只是我的一個副項目,這就是我推出自己的解決方案的原因。
首先,請允許我對一般會議設計進行佈局,然後我將提出一些具體問題。這是我的會話服務的概述:
- 使用RFC 4122 第 4 版 uuid 生成器生成隨機會話 ID 。我將此 ID 與其他一些資訊(使用者 ID、到期時間等)一起儲存在 redis 中。
- 使用 hmac sha512 散列此會話 id 的字節數組。我的散列密鑰是用 openssl 生成的
$ openssl rand -base64 64
- 將 hmac 雜湊的字節附加到會話 ID 的字節數組中。Base64 對結果數組進行編碼,字元串化並設置為僅 http 的安全 cookie。
在收到來自客戶端的請求後,驗證使用者會話基本上是上述步驟,但相反。
我的問題是:
- 將 hmac 雜湊附加到會話 id 是否提供任何好處,而不僅僅是為 cookie 設置版本 4 uuid?我的想法是,我可以在 ping 我的數據庫之前使用我的密鑰驗證 hmac 簽名以檢查會話 ID 是否已過期。如果有人試圖猜測會話 ID,這將減少訪問我的數據庫的次數。
- sha512 對我的會話 ID 進行散列處理是否過大?我的理解是在 64 位機器上它應該更快。
- 將散列字節數組附加到會話 id 字節數組、base64 編碼和字元串化結果是否是將這些資訊儲存在 cookie 中的正確方法?
- 為
$ openssl rand -base64 64
我的目的生成密鑰的正確方法是什麼?基於這個討論,我的理解是我的密鑰長度最好在 64 到 128 字節之間。- 你還有什麼要補充的嗎?有什麼我忽略的嗎?
感謝您的輸入。乾杯!
1. 將 hmac 雜湊附加到會話 id 是否提供了超出簡單地為 cookie 設置版本 4 uuid 的任何好處?
正如您自己發現的那樣,主要好處是消除了用於驗證 cookie 的數據庫查詢。
2. sha512 對我的會話 ID 進行散列處理是否過大?我的理解是在 64 位機器上它應該更快。
儲存/頻寬限制可能比速度限制更重要,因為 cookie 被限制為 4K。因此,作為一般設計指南,最好使用 256 位散列。您可以通過僅使用 SHA512 生成的雜湊中的 256 位來實現這一點。
3. 將散列字節數組附加到會話 id 字節數組、base64 編碼和字元串化結果是否是將這些資訊儲存在 cookie 中的正確方法?
這不是一個真正的密碼學問題,而是一個軟體工程問題。簡而言之,您希望對 cookie 進行格式化,以便您和其他人能夠在很長一段時間內調試問題並修復您的程式碼。
4. $ openssl rand -base64 64 是為我的目的生成密鑰的正確方法嗎?基於這個討論,我的理解是我的密鑰長度最好在 64 到 128 字節之間。
又是一個軟體工程問題。假設您使用 bash 以外的某種程式語言編寫程式碼,則最好使用該語言的密碼庫。至於密鑰長度,32 字節(256 位)應該足夠了。
5. 還有什麼要補充的嗎?有什麼我忽略的嗎?
嘗試查看已建立庫的實現。不確定您想將其用於什麼以及您將使用哪種語言,因此很難給出正確的建議。一個浮現在腦海中的 Python 範例就是這個,但也許你又一次進入了不同的案例。