Algorithm-Design

JWT 的 HMAC 與 ECDSA

  • February 24, 2019

我將在我的網站中實現 JSON Web 令牌,並對實現它們有疑問。我可以選擇使用兩種算法,HMAC-SHA256 和 ECDSA-SHA256。我過去曾將 HMAC-SHA256 用於 jwt,但現在我注意到 ECDSA 已被添加到許多 jwt 庫中。作為一個沒有強大安全背景的人,我想知道這兩者之間的優點/缺點是什麼?嘗試Google HMAC 與 ECDSA 並沒有帶來任何好的結果。我關心的領域包括:

  • 速度(由於我的伺服器需要簽署許多令牌,它們的性能如何?)
  • 安全性(它們如何對抗暴力攻擊和彩虹表?這可能與我的第一個問題有關。)
  • 穩定性(這些算法是否被認為是穩定、經過驗證和可靠的?)

區別在於 ECDSA 解決了 HMAC 沒有解決的問題。如果你需要解決這個問題,那麼你需要做 ECDSA 而不是 HMAC;如果你不這樣做,那麼 HMAC 也能正常工作(而且便宜得多)。

使用 HMAC,我們擁有的是:我們有一個具有密鑰的身份驗證器。它接收一條消息,並將該消息(和密鑰)提供給 HMAC 算法,然後生成一個標籤。我們將該標籤連同消息一起發送給驗證者。

驗證者也有密鑰。它接受接收到的消息,並將其(和密鑰)提供給 HMAC 算法,然後生成標籤。然後它檢查計算出的標籤是否與它收到的完全一樣;如果是,則它知道該消息與最初發送時完全相同。

有了 ECDSA,這就是我們所擁有的。我們有一個具有私鑰的身份驗證器。它接收一條消息,並將該消息(和密鑰)提供給 ECDSA 簽名算法,然後生成一個標籤。我們將該標籤連同消息一起發送給驗證者。

驗證者也有公鑰(不是驗證者的私鑰)。它獲取接收到的消息和標籤,並將其(和公鑰)提供給 ECDSA 驗證算法,並檢查標籤是否對應於消息。如果確實如此,那麼它就知道該消息與最初發送時完全相同。

那麼,有什麼不同呢?使用 HMAC,雙方共享相同的密鑰;驗證者可以(如果願意的話)為其選擇的消息生成自己的標籤,並且這些標籤也可以驗證。使用 ECDSA,這不會發生;驗證者擁有的密鑰(公鑰)允許它檢查標籤,但不允許它自己生成標籤。

那麼,這種區別在您的場景中重要嗎?我不知道你在做什麼。你需要回答的問題是:你能相信驗證者不會生成自己的代幣嗎?你能相信有權訪問驗證者密鑰的人不會這樣做嗎?如果這不是您擔心的事情(可能是因為驗證者是唯一關心由一組特定密鑰生成的標籤的人),那麼 HMAC 就可以正常工作(而且,正如我之前提到的,它便宜得多)。如果您確實關心(例如,您將驗證程式碼分發給很多人,並且您擁有一組密鑰),那麼 HMAC 有多便宜並不重要 - 它不能解決您的問題 - 您需要去像 ECDSA 這樣的東西

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