Authentication

使用 HMAC 的認證方案

  • July 18, 2018

我有一個身份驗證服務、一個客戶端和一個應用程序服務。

客戶端需要使用應用程序,但必須先進行身份驗證。我正在嘗試創建一個簡單的方案來做到這一點,而我想出的是:

  1. 客戶端聯繫身份驗證服務,發送其元數據(例如許可證號)
  2. 身份驗證服務驗證客戶端(即根據數據庫檢查許可證)並返回一個令牌,該令牌包含:應用程序所需的一些新元數據,一個時間戳,告訴何時創建令牌以及HMAC-SHA256提到的數據。
  3. 客戶端使用此令牌聯繫應用程序服務並執行其任務
  4. 應用程序服務通過驗證來檢查客戶端的令牌HMAC-SHA256(從而確認令牌是由身份驗證伺服器生成的)並檢查時間戳,確認令牌仍然有效。如果操作成功,它將使用令牌中的元數據來執行客戶端所需的任務。

身份驗證服務和客戶端之間以及客戶端和應用程序服務之間的所有通信都是通過 HTTPS 完成的。身份驗證服務和應用服務之間共享的密鑰會很大(例如,至少 64 字節)

我的問題是,是否有人看到這個方案有任何缺陷。

PS:我知道 OAuth 1/2 存在,但老實說,我很害怕研究這些。我需要的是非常簡單的東西,比如每個人都反對的“JWT 無狀態會話”。哦,我不想使用 JWT 或 Paseto,因為我已經做了一個基準測試並且一個簡單的 HMAC 更快(至少比 Paseto)

身份驗證服務和客戶端之間以及客戶端和應用程序服務之間的所有通信都是通過 HTTPS 完成的。

因此,至少伺服器通過了客戶端的身份驗證,並且通信通道是私有的。

這不是真正的身份驗證問題。您擁有的是基於能力的訪問控制,而許可證(和令牌)用作授權使用者操作的能力列表。您的目標(我猜)是只有擁有有效許可證的使用者才能訪問該應用程序。伺服器的令牌受 MAC 保護,因此應該保持完整性(假設使用了良好的 MAC 方案和良好的密鑰管理)。應用程序伺服器可以確定令牌是由身份驗證伺服器生成的,並且不久前(時間戳)。

第一個問題是客戶是否需要證明其擁有許可證。僅提供許可證編號是不夠的,因為該編號是一個可以被竊取甚至簡單列舉的字元串。如果您需要擁有證明,則需要將許可證連結到一些只有所有者知道的可驗證秘密,例如密鑰、密碼。這類似於在花費比特幣時需要帳戶的私鑰。在比特幣中,帳號相當於您的許可證號,使用與帳號關聯的公鑰可驗證的簽名是所有權證明。如果您不關心並且任何擁有許可證號碼的人都可以使用您的服務,那麼這不是問題,您有下一個問題。

下一個問題是防止多個使用者共享一個許可證。這類似於電子現金中的雙重支出問題,在您的情況下,由於您有一個集中式系統,因此可以輕鬆解決。例如,在頒發令牌時,認證伺服器可以記錄許可證號和令牌過期時間。如果使用者的許可證號已經頒發了令牌並且令牌尚未過期,則伺服器可以拒絕頒發新令牌。應用程序伺服器還可以將令牌連結到會話,以確保每個令牌只能初始化一個會話。當然,還有一些實際問題,比如使用者可能會因為電腦意外關機等原因失去令牌,完整的解決方案需要涵蓋這些。

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