海報說如果我們不使用客戶端SSL認證服務器並不真正知道它與誰通話。
這不是我說的:)這就是我說的:
除非你使用TLS客戶端認證,SSL孤獨不是一個REST API一個可行的認證機制。
單獨是這裏的關鍵詞。另外:
如果不使用TLS客戶端身份驗證,則需要使用像一個基於摘要驗證方案(如亞馬遜Web服務的定製方案)或OAuth的,甚至HTTP基本身份驗證(但在僅限SSL)。
換句話說,TLS客戶端認證是一個認證REST API客戶端的方式。因爲最初的SO問題是關於SSL的具體問題,所以我提到TLS客戶端身份驗證是唯一的「內置」身份驗證形式,如果您僅依賴於TLS。因此,如果您使用的是TLS,並且您不使用TLS客戶端身份驗證,則您必須使用其他形式的身份驗證來驗證您的客戶端。
認證REST客戶端有很多方法。 TLS客戶端認證只是其中的一個(TLS唯一的「內置」,通常非常安全)。但是,TLS是網絡級別的協議,大多數人認爲對於許多最終用戶來說配置過於複雜。因此,大多數REST API產品選擇易於使用的應用程序-像HTTP一樣的級別協議,因爲它最容易使用(例如只設置HTTP標頭)。
因此,如果您要使用HTTP標頭路由,則必須使用標頭值來認證REST客戶端。
在HTTP身份驗證中,您有一個標頭Authorization
及其值(標頭名稱相當不幸,因爲它通常用於身份驗證,而不是經常用於訪問控制,也稱爲授權)。所述Authorization
頭值是什麼是由服務器使用以執行認證,並且它的三個令牌
- 一個HTTP認證方案名組成(通常),接着
- 空白(幾乎總是空格字符),然後是
- 特定於計劃的文本值。
一個常見的HTTP認證方案是Basic
方案,這是非常......呃......基本:)。具體的方案文本值就是以下計算值:
String concatenated = username + ":" + raw_password;
String schemeSpecificTextValue = base_64_encode(concatenated.toCharArray());
所以,你可能會看到對應首是這樣的:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
服務器知道如何解析值。它說:「嘿,我知道Basic
方案,所以我要採取尾隨的文本值,base64 解碼它,然後我會有用戶名和提交的密碼。然後我可以看到這些值是否匹配我儲存了。「
而這基本上是Basic
身份驗證。因爲這個方案特別包含了提交的原始密碼base64編碼,所以它不被認爲是安全的除非你使用TLS連接。 TLS保證(大部分)窺探者的眼睛不能攔截標題(例如,通過數據包檢查)並查看密碼是什麼。這就是爲什麼你應該從來沒有使用HTTP基本認證,除非它是通過TLS連接。 總是 - 即使在公司內部網環境中。
當然還有其他更安全的HTTP身份驗證方案。一個示例是使用基於摘要的身份驗證的任何方案。
基於摘要的身份驗證方案更好,因爲它們的方案文本值爲而不是包含提交的密碼。相反,計算某些數據(通常是其他標題字段和值)的基於密碼的散列值,並將結果存入標頭值Authorization
。服務器使用它本地存儲的密碼計算相同的基於密碼的哈希。如果服務器的計算值與請求的標頭值匹配,則服務器可以認爲請求已通過驗證。
這就是爲什麼這種技術更安全:只傳輸散列 - 不是原始密碼本身。這意味着即使通過明文(非TLS)連接,也可以使用這種技術來驗證請求(但如果請求數據本身並不敏感,那麼您只需要這樣做)。
一些基於摘要身份驗證方案:
Stormpath的和Amazon的是REST比OAuth的1.0A更安全,因爲他們總是驗證請求實體的有效載荷。 OAuth 1.0a僅對application/x-www-form-urlencoded
內容執行此操作,這與使用application/xml
或application/json
有效內容(目前看來是大多數REST API)的REST API無關。
有趣的是,的OAuth2是不摘要基於 - 它使用的東西,我認爲不太安全的,被稱爲「承載令牌」,這在我看來是有症狀的OAuth 2的various problems的。
最後,是的,這是一個無恥的插件,但如果你不想擔心這個東西,只需使用Stormpath(許多用例都是免費的)。我們自動化這些東西,所以你的應用程序不需要。
謝謝!當你說「服務器知道如何解析這個值,它說」嗨,我知道基本方案,所以我要取文本值,base64解碼它,然後我將擁有用戶名和提交的密碼。然後我可以看到這些值是否與我存儲的值相匹配。「 – Spring
這就是說,我的代碼實際上是在解析這個http頭部,而不是web服務器 – Spring
使用摘要我以爲我必須使用」共享密鑰「客戶端和它會使事情變得複雜,但我看到我可以使用用戶密碼作爲密鑰,所以沒有額外的工作要做。更正@ – Spring