2010-03-05 105 views
68

摘要式身份驗證與基本身份驗證有什麼不同,除了以純文本形式發送憑據外?什麼是摘要認證?

+0

@Gumbo偉大的解釋就在這裏:http://stackoverflow.com/a/5288679/591487 – inorganik

+2

一些你永遠不應該使用的東西。不保護傳輸中的密碼並要求服務器以普通的方式存儲密碼。 – CodesInChaos

+1

摘要確實提供比傳輸安全性更好的傳輸安全性,但它很弱。使用基本身份驗證與SSL/TLS結合使用會更安全,因爲這樣您也可以將服務器上的密碼加密。 – rustyx

回答

112

的主要區別是,它不需要以純文本形式通過線路發送的用戶名和密碼。它也不受重播攻擊的影響,因爲它使用來自服務器的一次性號碼。

服務器向客戶端提供與用戶名,域,密碼和URI請求相結合的一次性使用號碼(隨機數)。客戶端通過MD5哈希方法運行所有這些字段以生成哈希鍵。

它將此散列密鑰與用戶名和領域一起發送到服務器以嘗試進行身份驗證。

服務器端使用相同的方法生成hashkey,而不是使用輸入到瀏覽器的密碼,服務器從用戶數據庫中查找用戶的預期密碼。它查找此用戶名的存儲密碼,通過相同的算法運行並將其與客戶端發送的內容進行比較。如果它們匹配,則授予訪問權限,否則它可以發回401 Unauthorized(未登錄或失敗登錄)或403 Forbidden(拒絕訪問)。

摘要式驗證是standardized in RFC2617。有一個nice overview of it on Wikipedia

你可以認爲它像這樣:

  1. 客戶端發出請求
  2. 客戶回來從服務器現時和401的認證請求
  3. 客戶端返回以下響應數組(用戶名,領域,generate_md5_key(隨機數,用戶名,realm,URI,password_given_by_user_to_browser))(是的,這是非常簡化)
  4. 服務器接受用戶名和領域(加上它知道客戶端請求的URI),它廁所k取得該用戶名的密碼。然後它自動執行generate_md5_key(nonce,username,realm,URI,password_I_have_for_this_user_in_my_db)
  5. 它將generate_md5()的輸出與客戶端發送的輸出進行比較,如果它們與客戶端發送的正確匹配密碼。如果它們不匹配,則發送的密碼錯誤。
+0

很好的解釋。是Windows用戶的用戶名和密碼?他們從哪裏產生? – SoftwareGeek

+0

它們是用戶輸入到瀏覽器中的任何內容。密碼需要與服務器爲該用戶密碼存儲的任何內容匹配。更有可能的是,這是特定於該Web應用程序的東西,而不是您的Windows密碼。它非常依賴於Web應用程序的組合方式。 –

+7

這個答案已經有6年了,但我猜所有安全感知系統現在都會將密碼以salted-hash格式存儲。沒有,也不應該有任何方法從數據庫中獲得原始密碼,使得摘要授權變得不可能。 –

10

憑證的哈希通過線路發送。

HA1 = MD5(username:realm:password) 

Wikipedia has an excellent article on this topic

+0

從客戶端到服務器?您能否提供相互作用的步驟? 維基百科文章很好,但我需要更好的解釋或例子。 – SoftwareGeek

+0

是的客戶端生成散列值並將其發送到服務器。維基百科的文章詳細描述了協議,我建議你參考一下以獲取更多信息。 –

1

獲取證書哈希值HA1的唯一方法是知道密碼。服務器知道HA1但不知道生成它的密碼。如果攻擊者知道HA1可以進入系統。所以它不會被髮送出去。基於nonce等的進一步散列在完成之前完成,並且這必須與在服務器上完成的類似計算一致。因此,只要服務器保持HA1私密,系統就是安全的。

+0

這是摘要式身份驗證的解釋,其中密碼不是以純文本形式發送的(基本身份驗證是這種情況) –