2014-04-03 29 views
1

我想確保一個.NET Web API服務。我將使用SSL,但我還需要限制每個用戶可以調用的Web API調用,具體取決於用戶的權限。Web API:基本認證或基於SSL的HMAC?

從我讀到的,REST/HTTP應該是無狀態的,所以在技術上你不應該能夠維持任何會話狀態,但是圍繞這一點有some ways

一種是使用basic authentication。憑據隨每個請求一起發送。雖然這在安全性方面可能沒有問題,因爲它們是通過SSL傳輸的,但實際上並不實際,因爲每次都需要大量開銷來重新對數據庫進行身份驗證。 (有可能將它們緩存在內存中,但我懷疑這是最好的方式。)

另一個可能是使用HMACexample implementation)來控制對API調用的訪問。有一個在這個article,說評論:

只是要清楚,是在自己的HTTPS服務,實施這個的人:你不需要實現HMAC SSL的!絕對沒有理由浪費時間和浪費複雜性。不要這樣做。使用基本身份驗證並完成它。

由於上述原因,我不同意這種觀點(使用HMAC進行一次認證和控制比每次認證更加實際)。

使用HMAC在通過SSL進行工作時爲Web API調用提供安全性,還是存在任何我缺少的點是否是一種很好且有效的做法?

+0

基本的ist便宜且速度非常快,如果你做得對,數據庫查找速度非常快。 –

+0

是的,但如果每次用戶會話都做一次,那麼做10萬次就太浪費了。 – Gigi

回答

2

答案取決於你對安全性的關心程度。

這個API用於什麼?如果安全性是一個大問題,基本身份驗證不是一個很好的選擇 - 即使您使用SSL。

即使您使用的是SSL,攻擊者可以控制或訪問您的初始請求,也可以僞裝成所需的HTTPS Web服務,並輕鬆攔截您的流量(然後獲取您的API憑據)。

一個更好的解決辦法是做幾件事情:

  • 使用API​​密鑰和密碼。
  • 每個請求都生成一個唯一的ID。
  • 爲每個請求生成一個時間戳。
  • 根據您的API密鑰祕密對請求正文進行加密。
  • 將加密的輸出放入以下格式的HTTP_AUTHORIZATION標頭中:API_KEY_ID:
  • 在服務器端,解密有效負載。
  • 比較時間戳 - 如果請求發送超過一秒鐘 - 放下它(這可以防止計時攻擊)。
  • 比較唯一的ID - 如果這個請求已經執行 - 放棄它(這可以防止重放攻擊)。

上述策略使得攻擊者無法獲得對API憑據的訪問權限,即使他們能夠成功地在您的API調用中進行中間人操作。

+0

我發現最初的請求很難相信......如果是這種情況,我認爲沒有HTTPS流量是安全的。 SSL握手不是爲了防範這種類型的依戀?另外,您能否詳細說明API密鑰(它是什麼以及它是如何使用的)? – Gigi

+0

最初的請求絕對可以是中間人 - 這是SSL本身不安全的最大原因 - 這也是HSTS頭文件應該幫助的一件事情(但是這個只適用於網站,不適用於API)。 Re API密鑰:將API密鑰設想爲用戶名,將API密碼設爲密碼。您可以使用這些變量在將API請求發送到服務器之前對其進行加密,從而可以通過線路發送安全數據。 – rdegges