使用 Mac 生成令牌?
我正在編寫一個 Web 服務,它為每個客戶端連接提供一個唯一的令牌。以下是所需的屬性。我假設伺服器頒發的令牌數據庫失去並且不可信的客戶端將令牌呈現給伺服器。
- 伺服器應該能夠判斷令牌是否先前由伺服器發出。
- 伺服器應該能夠知道令牌何時發出。
因此,我正在考慮使用 Poly1305 根據時間戳和計數生成令牌,以便伺服器可以在不維護令牌數據庫的情況下查看時間戳。例如:
- token1 = Poly1305(“2017-04-25T21:12:32Z 1”)
- token2 = Poly1305(“2017-04-25T21:12:40Z 2”)
- token3 = Poly1305(“2017-04-30T22:12:32Z 3”)
我的問題是:
- 這安全嗎?(包括為所有令牌重用密鑰和隨機數)
- 我是在做一些愚蠢的事情還是有更好的方法?
謝謝你。
這安全嗎?我在做傻事嗎?
好吧,我認為這實際上並不安全。但是為什麼它不安全取決於您的庫在 Poly1305 函式中實現的細節。
直 Poly1305 不是 MAC;它實際上是一個通用雜湊。也就是說,它接受一個消息和一個鍵並產生一個值;但是(與 MAC 不同)它的唯一保證是,對於兩個不同的消息 $ M, M’ $ , 我們會有 $ \text{Poly1305}_K(M) = \text{Poly1305}_K(M’) $ 僅適用於一小部分鍵(因此,如果鍵 $ K $ 是隨機選擇的,這不太可能。
這並不能保證有人在看 $ \text{Poly1305}_K(M) $ 各種值 $ M $ 會在恢復方面遇到任何困難 $ K $ ,對於 Poly1305 函式本身,恢復 $ K $ 簡單。因此,如果您的 Poly1305 函式只實現了通用雜湊函式本身,那麼它就被破壞了。
現在,Poly1305 的這種使用實際上並沒有使用隨機數,所以我不確定你是否直接使用它。
要將 Poly1305 用作 MAC,我們要做的是計算消息的 Poly1305,然後使用一些密碼(最常見的是 AES 或 ChaCha)用隨機數加密標籤。這是安全的;Poly1305 可防止某人生成兩條具有相同 MAC 的消息(因為使用未知的 Poly1305 密鑰,這不太可能),而 AES/ChaCha 密碼將阻止某人直接看到 Poly1305 輸出(因此以這種方式恢復事物)。
但是,我們通過獲取隨機數,通過密碼發送,然後將其添加到 Poly1305 輸出來進行加密;如果我們重複使用相同的隨機數,這意味著我們將向 Poly1305 添加一個常數值,攻擊者可以對其進行調整。
另一方面,這樣做通常會呼叫所使用的密碼,例如 Poly1305-AES 或 Poly1305-ChaCha
所以,我不確定為什麼你正在做的事情不安全;但它看起來不太好。
有沒有更好的辦法?
如果您發現為每個令牌使用不同的隨機數不方便,我是否建議使用 HMAC(基於一些合理的雜湊函式,例如 SHA256)?這不需要隨機數,因此您是安全的(或者,至少,只要您可以保密)。它不如 Poly1305 快;看起來你不會關心那個。