zoukankan      html  css  js  c++  java
  • 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 是实现较简单且安全性较高的一种方式。

  • 相关阅读:
    Servlet访问第一次500,刷新后404的解决办法
    关于eclipse保存代码很慢,提示the user operation is waiting的问题
    编译时,运行时解释
    JDK、JRE、JVM
    IDEA使用maven中tomcat插件启动项目乱码问题
    treeGrid树形数据表格的json数据格式说明
    Maven最佳实践:Maven仓库(转)
    intelliJ idea debug模式下启动慢的原因
    基于 Annotation 拦截的 Spring AOP 权限验证方法
    化繁为简 如何向老婆解释MapReduce?(转载)
  • 原文地址:https://www.cnblogs.com/ash975/p/15209361.html
Copyright © 2011-2022 走看看