我剛剛開始在.NET中開發我的第一個REST API。因爲它是無狀態的,我將使用令牌認證:REST API令牌認證
基本思路(System.Security.Cryptography):
- AES加密+ HMACSHA256完整性
- 令牌數據將包括與對象屬性:用戶名,發佈日期和超時
- 數據庫將持有的用戶名,哈希密碼和HMAC哈希
登錄:
- 如果檢查證書是否有效(用戶名,比較散列密碼,以dB值)
- 如果屬實,加密數據對象
- 使用HMAC上生成的令牌,並將其存儲到數據庫
- 返回令牌(不HMAC)到用戶(餅乾/串)
請求方法,該方法要求身份驗證:
- 用戶發送令牌與每個請求
- 令牌進行解密
- 如果它已過期,錯誤
- 如果沒有過期使用HMAC,並比較用戶名+用分貝產生的散列值
- 如果分貝檢查有效,用戶驗證
我看到它的方式,這種方法有以下優點:
- 即使DB是comprosmised,它不包含實際令牌(哈希不能顛倒...)
- 即使攻擊者擁有的道理,他無法通過更新字段,因爲截止日期是在增加到期代幣本身
現在首先,我想知道這是否是一種好方法。
除此之外,我仍然沒有弄清楚,在服務器上存儲AES和SHA256密鑰的位置(我應該只是硬編碼它們嗎?如果我把它們放入web.config或使用機器密鑰比我遇到問題負載平衡的服務器......)。
最後,我在哪裏存儲AES IV向量,因爲Crypto.CreateEncryptor需要它來解密?這是否意味着用戶必須向每個請求發送令牌+ IV?
我希望這是有道理的,我提前感謝您的答覆。
UPDATE:
好了,現在我做了一些調查研究,並來到了該解決方案:
- 令牌將包含原先指定的數據(用戶名,發放和超時的日期)
- 令牌生成與encrypt-then-mac(它包括AES加密數據,IV矢量+標籤這2個值用於驗證,用HMACSHA265生成)
- 令牌標記將生成如果被寫入到數據庫
- 用戶將進行身份驗證:
- 標記有效(令牌認證)
- 數據可以被解密
- 令牌尚未到期
- 標籤相匹配的寫入數據庫
- 用戶沒有被阻塞在數據庫(按需令牌無效)
- 鍵將被存儲的I ñweb.config單獨的部分。相同的密鑰將因爲.NET有以下幾個問題要在每個服務器上(每個應用程序當然)
我沒有使用的FormsAuthenticationTicket:
- 相同的密鑰用於不同的目的(對於視圖狀態,資源和formauthtickets)
- MAC-當時的加密,通過.NET使用的machineKey不認爲as safe as encrypt-then-mac
- 沒有內置的方式來invalidate token before it is expired
我很好奇,爲什麼將數據存儲在令牌中?如果你必須對數據庫進行驗證,那麼爲什麼不把數據存儲在數據庫中,只需使用Guid或其他隨機令牌? – 2013-03-18 12:45:54
由於令牌過期日期 - 我想確保它不能在數據庫中更新+如果過期無效,您不必進行數據庫查詢。 – 2013-03-18 12:52:07
您應該查看OAuth(http://oauth.net/),因爲這基本上就是您在這裏描述的內容。 – 2013-03-18 14:30:11