Hmac

通過 HMAC 加密查詢參數

  • July 31, 2021

我有一個取消訂閱連結,需要傳遞一個客戶 ID 和一個產品 ID,生成一個查詢字元串,如下所示:

?cid=100&pid=2

我想確保客戶是取消訂閱的人,並且他們正在取消訂閱確切的產品。HMAC 似乎是一個合乎邏輯的選擇:

?cid=100&pid=2&hmac=<HMAC generated from secret key and cid=100&pid=2>

…我可以驗證 HMAC 以保證真實性和完整性。

但是,例如,如果連結在電子郵件中傳遞,我還想對客戶 ID 和產品 ID 保密。如果 HMAC 基於它們,我不能這樣做。例如,如果我剛剛通過了 HMAC:

?hmac=<HMAC generated from secret key and cid=100&pid=2>

在這種情況下,我不能不推斷有問題的客戶 ID 和產品 ID(沒有暴力破解雜湊)。

是否有返回加密/散列查詢參數的標準方法?

不,我不能使用 SSL/TLS。

不在 URI 上使用加密:

  • 如果您將訂閱者儲存在數據庫中,也許您還可以在有人要取消訂閱時在某個列上儲存額外的(例如)128 位隨機值。這樣一來,該交易之外的價值就沒有任何意義,並且它不能洩露任何關於密鑰的資訊。

如果您不能在數據庫上使用其他數據,請使案例如:

  • 您最喜歡的 AEAD 方案(或 Encrypt+HMAC 方案)用於加密 cid+pid 對並附加身份驗證標籤。也許例如 GCM 使用 96 位隨機 IV 和 96 位身份驗證標籤。如果有少於 40 億的客戶和少於 40 億的產品,這將適合大約 256 位或與(未截斷的)HMAC-SHA256 相同的大小。您可以使用 base64 的某些變體將 URI 中的值編碼為 43 個字元。

HTTP 標準沒有指定如何加密或散列參數。TLS/SSL 是應用機密性和其他安全屬性的標準方式。

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