HTTP 常见的用户认证可以分为下面三种:
- 基于IP,子网的访问控制(ACL)
- 基本用户验证(Basic Authentication)
- 消息摘要式身份验证(Digest Authentication)
一.基本身份验证(Basic Authentication)
原理:
一个页面访问请求
GET /auth/basic/ HTTP/1.1
Host: target
Web服务器要求用书输入用户凭据(服务器返回401响应头和’realm’)
HTTP/1.1 401 Authorization Required Date: Sat, 08 Jun 2013 12:52:40 GMT WWW-Authenticate: Basic realm="Basic auth Dir" Content-Length: 401 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html; charset=iso-8859-1
浏览器弹出登录窗口(包含’realm’),要求用提供用户名/密码
GET /auth/basic/ HTTP/1.1 Host: target Authorization: Basic TGVuZ1dhOjEyMzQ1Ng== //Basic后面就是LengWa:123456经过Base64编码后的字符串
服务器将用户输入的凭据和服务器端的凭据进行比较。
二.消息摘要式身份验证(Digest Authentication)
原理:
Digest Authentication在基本身份验证上面扩展了安全性. 服务器为每一连接生成一个唯一的随机数, 客户端对用这个随机数对密码进行MD5加密. 然后发送到服务器. 服务器端也用此随机数对密码加密, 然后和客户端传送过来的加密数据进行比较.
一个页面访问请求
GET /auth/basic/ HTTP/1.1
Host: target
Web服务器要求用书输入用户凭据(服务器返回401响应头和’realm’)
HTTP/1.1 401 Unauthorized WWW-Authenticate: Digest realm="Digest Encrypt", domain="www.domain.com", nonce="nmeEHKLeBAA=aa6ac7ab3cae8f1b73b04e1e3048179777a174b3", opaque="0000000000000000", stale=false, algorithm=MD5, qop="auth"
浏览器弹出登录窗口(包含’realm’), 要求用提供用户名/密码
GET /auth/digest/ HTTP/1.1
Accept:text/html Authorization: Digest username="LengWa", realm="Digest Encrypt", qop="auth", algorithm="MD5", uri="/auth/digest/", nonce="nmeEHKLeBAA=aa6ac7ab3cae8f1b73b04e1e3048179777a174b3", nc=00000001, cnonce="6092d3a53e37bb44b3a6e0159974108b", opaque="0000000000000000", response="652b2f336aeb085d8dd9d887848c3314"
服务器将用户输入加密后的凭据和服务器端加密后的的凭据进行比较.如果一致则返回所请求页面的响应.
总结:
Basic验证方式配置相对简单,但是安全性太低,不适合一些加密要求比较高的站点。
Digest则相反,加密性是很高,但是实现起来还是有一点难度的,所以根据自己需要,选择不同的加密方式。