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​
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"


鉴权流程为

访问服务器资源,服务器返回 ​​401 Unauthorized​​,并携带 ​​nonce​​和鉴权加密算法
计算鉴权值,填充到 HTTP Header 中
再次访问服务器资源,鉴权成功,服务器返回 ​​200 Ok​​
点评:

RFC 2069 提供的鉴权方式,在一定程度上增加了安全性,将固定的鉴权值变为动态,并且将用户名密码计算部分隐藏起来,降低了被碰撞的可能性。

但是这样只能通过 ​​nonce​​ 保证服务器的动态变化,无法保证客户端的随机性

现在 2069 已被标记为 ​​out of date​​,取而代之的是 2617

三、Digest RFC 2617​
鉴权值计算如下:

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​​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值