Digest Auth

一、简介

Digest Auth(摘要访问认证)是一种协议规定的Web服务器用来同网页浏览器进行认证信息协商的方法。它在密码发出前,先对其应用哈希函数,这相对于HTTP基本认证发送明文而言,更安全。

从技术上讲,摘要认证使用随机数来阻止进行密码分析的MD5加密哈希函数应用。它使用HTTP协议。
  
HTTP Digest Auth是对HTTP Basic Auth的增强。由于HTTP Basic Auth几乎是以明文传输用户名和密码,容易泄露。而HTTP Digest Auth能够传递认证信息,但是传递的是使用摘要算法(如:MD5)产生的密文,服务端也不用存储明文用户信息,降低了泄密的可能性。但是这种方式仍然可以通过中间人攻击的方式拦截、模拟,所以算是一种折中方案。

二、原理

摘要访问认证最初由RFC 2069 (HTTP的一个扩展:摘要访问认证)中被定义。RFC 2069 大致定义了一个传统的由服务器生成随机数来维护安全性的摘要认证架构。认证响应由下列组成(HA1、HA2、A1、及A2为字符串变量的名称):

1
2
3
HA1 = MD5(A1) = MD5(username:realm:password)
HA2 = MD5(A2) = MD5(method:digestURI)
response = MD5(HA1:nonce:HA2)

这只是最基本的情况,为了防止中间人攻击,增加安全性,还有其他选项,不过这些都不影响总体原理。

三、认证过程

典型的认证过程包括如下步骤:

  • 客户端请求一个需要认证的页面,但是不提供用户名密码。通常这是由于用户简单的输入了一个地址或者在页面中点击了某个超链接
  • 服务器返回401 "Unauthorized"响应代码,并提供认证域(realm),以及一个随机生成的、只使用一次的数值,称为密码随机数 nonce
  • 此时,浏览器会向用户提示认证域(realm)(通常是所访问的计算机或系统的描述),并且提示用户名和密码。用户此时可以选择取消。
  • 一旦提供了用户名和密码,客户端会重新发送同样的请求,但是添加了一个认证头包括了响应代码。
  • 在这个例子中,服务器接受了认证并且返回了请求页面。如果用户名非法和/或密码不正确,服务器将返回”401”响应代码,然后客户端会再次提示用户输入用户名及密码。