HTTP 常見鑒權


HTTP 常見鑒權

一、Basic Auth

a
Basic Auth 使用 Base64 摘要算法生成密文

格式為 用戶名:密碼 ,用戶名密碼以:分割
例如:admin:123456

偽代碼如下:

value = "admin:123456"
encodedValue = base64(value)
AuthData = "Basice " + encodedValue 

可以使用工具在線計算
https://base64.us/

"admin:123456" 計算得對應編碼為 YWRtaW46MTIzNDU2

填充 HTTP 請求的報文頭

GET /LAPI/V1.0/PeopleLibraries/BasicInfo HTTP/1.1
Host: 192.168.1.100
Authorization: Basic YWRtaW46MTIzNDU2

點評:
Basic Auth 的安全性只能保護用戶名密碼不被明文讀取到,但編碼后是固定值,所以只要捕獲到該鑒權值,就相當於鑒權無效了。
改進方法就是在鑒權中增加臨時值,保證該鑒權值動態變化。

二、Digest RFC 2069

Document: https://datatracker.ietf.org/doc/html/rfc2069

Digest MD5(RFC 2069) 對 Basic Auth 的改進
鑒權值計算如下:

Hash1=MD5(username:realm:password)
Hash2=MD5(method:uri)
response=MD5(Hash1:nonce:Hash2)

其中
method 為 HTTP 請求方法 GET/PUT/POST...
URI為請求的資源地址,即除去http://<host>部分
realm 為固定值,用以標記用戶身份,由服務端提供
nonce 為隨機值,由服務端提供

例如 username=admin, password=123456, algorithm="MD5", nonce=5443494eb52c8658d88602d343810d35

ha1 = md5("admin:e4f14c15b4a5:123456")
ha2 = md5("GET:/LAPI/V1.0/PeopleLibraries/BasicInfo")
response = md5(ha1+":5443494eb52c8658d88602d343810d35:"+ha2)

注意一般計算值 ha1 ha2 response 需要轉為小寫 hex

填充 HTTP Header

GET /LAPI/V1.0/PeopleLibraries/BasicInfo HTTP/1.1
Host: 192.168.1.100
Authorization: Digest username="admin", realm="e4f14c15b4a5", nonce="5443494eb52c8658d88602d343810d35", uri="/LAPI/V1.0/PeopleLibraries/BasicInfo", algorithm="MD5", response="4e6ab960185269346884704a4c7458ce"

鑒權流程為

  1. 訪問服務器資源,服務器返回 401 Unauthorized,並攜帶 nonce和鑒權加密算法
  2. 計算鑒權值,填充到 HTTP Header 中
  3. 再次訪問服務器資源,鑒權成功,服務器返回 200 Ok

點評:
RFC 2069 提供的鑒權方式,在一定程度上增加了安全性,將固定的鑒權值變為動態,並且將用戶名密碼計算部分隱藏起來,降低了被碰撞的可能性。
但是這樣只能通過 nonce 保證服務器的動態變化,無法保證客戶端的隨機性
現在 2069 已被標記為 out of date,取而代之的是 2617

三、Digest RFC 2617

Document: http://www.faqs.org/rfcs/rfc2617.html

鑒權值計算如下:

Hash1=MD5(username:realm:password)
Hash2=MD5(method:URI)
response=MD5(Hash1:nonce:nonceCount:cnonce:qop:Hash2)

相比 2069,不同的在於增加了 qop cnonce nonce-count

qop 保護質量(quality of protection),可選值,由服務器提供,主要用來兼容 2069
cnonce 客戶端提供的字符串,用以雙向認證;當有 qop 時必須攜帶,否則必須不攜帶
nonce-count 客戶端提供的訪問請求數量(包括此次請求),采用16進制表示,用以校驗請求是否重復;當有 qop 時必須攜帶,否則必須不攜帶

例如 username=admin, password=123456, qop=auth, algorithm="MD5", nonce=5443494eb52c8658d88602d343810d35, cnonce=0aff113b, nc=00000001

ha1 = md5("admin:e4f14c15b4a5:123456")
ha2 = md5("GET:/LAPI/V1.0/PeopleLibraries/BasicInfo")
response = md5(ha1+":5443494eb52c8658d88602d343810d35"+":00000001"+":0aff113b"+":auth"+ha2)

注意一般計算值 ha1 ha2 response 需要轉為小寫 hex

填充 HTTP Header

GET /LAPI/V1.0/PeopleLibraries/BasicInfo HTTP/1.1
Host: 192.168.1.100
Authorization: Digest username="admin", realm="e4f14c15b4a5", nonce="5443494eb52c8658d88602d343810d35", uri="/LAPI/V1.0/PeopleLibraries/BasicInfo", algorithm="MD5", qop=auth, nc=00000001, cnonce="0aff113b", response="0ecd5b6626ec7214437a87e1f1a5cfdc"

注意,存在客戶端有 qop 但是 cnonce nonce-count 為空的情況,計算規則可以視為空字符串,具體如下

ha1 = md5("admin:e4f14c15b4a5:123456")
ha2 = md5("GET:/LAPI/V1.0/PeopleLibraries/BasicInfo")
response = md5(ha1+":5443494eb52c8658d88602d343810d35:::auth"+ha2)

填充 HTTP Header

GET /LAPI/V1.0/PeopleLibraries/BasicInfo HTTP/1.1
Host: 192.168.1.100
Authorization: Digest username="admin", realm="e4f14c15b4a5", nonce="5443494eb52c8658d88602d343810d35", uri="/LAPI/V1.0/PeopleLibraries/BasicInfo", algorithm="MD5", qop=auth, response="0ecd5b6626ec7214437a87e1f1a5cfdc"

鑒權流程為

  1. 訪問服務器資源,服務器返回 401 Unauthorized,並攜帶 nonce qop 和鑒權加密算法
  2. 計算鑒權值,填充到 HTTP Header 中
  3. 再次訪問服務器資源,鑒權成功,服務器返回 200 Ok

點評:
RFC 2617 新增了 cnonce 保證了客戶端和服務端的雙向認證,提供 nonce count 防止消息重復,提供了 qop 來兼容 RFC 2069,相比 Basic Auth 和 RFC 2069 是實現較簡單且安全性較高的一種方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM