1、定义
摘要认证(Digest Authentication)是一种用于在网络通信中验证用户身份的认证方法。
2、流程
(1)客户端发送一个未经认证的请求到服务器。
(2)服务器返回一个HTTP 401 Unauthorized响应,其中包含一个WWW-Authenticate头部字段。
(3)客户端收到401响应后,会根据服务器提供的信息,计算出一个摘要(digest)。客户端将摘要信息添加到请求头中,并重新发送认证请求。
(4)服务器收到带有摘要的请求后,会使用相同的算法计算出摘要,并与客户端发送的摘要进行比较,如果一致,则服务器会接受该请求并返回请求的资源,否则,服务器拒绝请求并返回401。
3、简单实例
(1)常用参数
username,用户。
password,密码。
realm,域,用来指示需要哪个域的用户名和密码。
nonce,服务端产生的随机数,唯一的、不重复的。
nc,认证的次数。
cnonce,客户端产生的随机数,唯一的、不重复的。
qop,包含auth和auth-int两种策略。
opaque,服务器端产生的字符串,透传而已。
response,服务器根据相关信息计算摘要,并与客户端传过来的response值对比,如果一样,则认证通过,否则通不过。
(2)实例
例如,第2(2)节,服务器生成nonce,如下
long expiryTime = System.currentTimeMillis() + (300 * 1000);
String signatureValue = DigestUtils.md5Hex(expiryTime + ":" + key);
String nonceValue = expiryTime + ":" + signatureValue;
String nonceValueBase64 = new String(Base64.getEncoder().encode(nonceValue.getBytes()));
String authenticateHeader = String.format("Digest realm=\"%s\", qop=\"auth\", nonce=\"%s\", opaque=\"%s\"", realm, nonceValueBase64, opaque);
......
例如,第2(4)节,服务器计算并比对摘要
String a1Md5 = DigestUtils.md5Hex(username + ":" + realm + ":" + password);
String a2Md5 = DigestUtils.md5Hex(httpMethod + ":" + uri);
String serverDigestMd5 = DigestUtils.md5Hex(a1Md5 + ":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + a2Md5);
if (!serverDigestMd5.equals(response)) {
......
}