digest认证详解
第一步,客户端发起资源请求
第二步,服务端返回WWW-Authentication
Digest realm="whitelist_authority", nonce="CuR5pLqxBQA=95e23db2988c7e3c1a937dba4fdaf6d8e71b8052", algorithm=MD5, domain="/fyx/ http://192.168.21.178/fyx/", qop="auth"
nonce是服务器生成的一段 random 字符串,realm指定了认证的作用域,algorithm指定了hash算法,qop代表保护质量参数,一般是 auth 或 auth-int,这会影响摘要的算法。
第三步,客户端发送认证信息,认证信息放在Authorization字段中,如下
Authorization: Digest username="admin", realm="whitelist_authority", nonce="uTQuyp+2BQA=b8605449f8ef432d6bbe1816ca22b3902a689551", uri="/fyx/", algorithm=MD5, response="c7c61a41f1797a4d8c767b35da71f814", qop=auth, nc=00000002, cnonce="586ee4f738ae507e"
response由以下三个步骤生成:
1.对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。
2.对HTTP方法以及URI的摘要的合并值计算 MD5 哈希值,例如,"GET" 和 "/dir/index.html",结果称为 HA2。
3.对 HA1、服务器密码随机数(nonce)、请求计数(nc)、客户端密码随机数(cnonce)、保护质量(qop)以及 HA2 的合并值计算 MD5 哈希值。结果即为客户端提供的 response 值。
HA1 = MD5(admin:whitelist_authority:xfnbs) = fe427accdddeffc487b33c0f174c4d60
HA2 = MD5(GET:/fyx/) = 60042ee7f41275159f74e2be620ad646
response = MD5(HA1:uTQuyp+2BQA=b8605449f8ef432d6bbe1816ca22b3902a689551:00000002:586ee4f738ae507e:auth:HA2) = c7c61a41f1797a4d8c767b35da71f814
之前我计算出来的response总是和报文中的response不一致,后来发现是生成的MD5大小写没有区分。。。
避免重放攻击
服务器只接收nc大于前一次的response,如果简单的将上一次验证成功的响应包重放,那么服务器会丢弃这一次的响应因为nc值不大于上一次响应。
如果修改nc值,那么服务器校验response时不会认证通过。
http basic认证
HTTP 提供一个用于权限控制和认证的通用框架。最常用的HTTP认证方案是HTTP Basic authentication。
RFC 7235 定义了一个 HTTP 身份验证框架,服务器可以用来针对客户端的请求发送 challenge (质询信息),客户端则可以用来提供身份验证凭证。质询与应答的工作流程如下:服务器端向客户端返回 401(Unauthorized,未被授权的) 状态码,并在 WWW-Authenticate 首部提供如何进行验证的信息,其中至少包含有一种质询方式。之后有意向证明自己身份的客户端可以在新的请求中添加 Authorization 首部字段进行验证,字段值为身份验证凭证信息。通常客户端会弹出一个密码框让用户填写,然后发送包含有恰当的 Authorization 首部的请求。
http digest认证
尽管 basic 认证采用了 base64 编码,但是 base64 算法是可逆的,所以基本验证方案并不安全。基本验证方案应与 HTTPS / TLS 协议搭配使用。假如没有这些安全方面的增强,那么基本验证方案不应该被来用保护敏感或者极具价值的信息。
digest 采用 hash 算法将认证信息转换为不可逆的字符串进行传输,可以避免明文传输密码。