在HTTP中,基本认证(Basic access authentication)是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
在发送之前是以用户名追加一个冒号然后串接上口令,并将得出的结果字符串再用Base64算法编码。例如,提供的用户名是Aladdin、口令是open sesame,则拼接后的结果就是Aladdin:open sesame,然后再将其用Base64编码,得到QWxhZGRpbjpvcGVuIHNlc2FtZQ==。最终将Base64编码的字符串发送出去,由接收者解码得到一个由冒号分隔的用户名和口令的字符串。
虽然对用户名和口令的Base64算法编码结果很难用肉眼识别解码,但它仍可以极为轻松地被计算机所解码,就像其容易编码一样。编码这一步骤的目的并不是安全与隐私,而是为将用户名和口令中的不兼容的字符转换为均与HTTP协议兼容的字符集。
最初,基本认证是定义在HTTP 1.0规范(RFC 1945)中,后续的有关安全的信息可以在HTTP 1.1规范(RFC 2616)和HTTP认证规范(RFC 2617)中找到。
基本认证的一个优点是基本上所有流行的网页浏览器都支持基本认证[1]。基本认证很少在可公开访问的互联网网站上使用,有时候会在小的私有系统中使用(如路由器网页管理接口)。后来的机制HTTP摘要认证是为替代基本认证而开发的,允许密钥以相对安全的方式在不安全的通道上传输。
程序员和系统管理员有时会在可信网络环境中使用基本认证,使用Telnet或其他明文网络协议工具手动地测试Web服务器。这是一个麻烦的过程,但是网络上传输的内容是人可读的,以便进行诊断。
虽然基本认证非常容易实现,但该方案创建在以下的假设的基础上,即:客户端和服务器主机之间的连接是安全可信的。特别是,如果没有使用SSL/TLS这样的传输层安全的协议,那么以明文传输的密钥和口令很容易被拦截。该方案也同样没有对服务器返回的信息提供保护。
现存的浏览器保存认证信息直到标签页或浏览器被关闭,或者用户清除历史记录。[2]HTTP没有为服务器提供一种方法指示客户端丢弃这些被缓存的密钥。这意味着服务器端在用户不关闭浏览器的情况下,并没有一种有效的方法来让用户退出。
这一个典型的HTTP客户端和HTTP服务器的对话,服务器安装在同一台计算机上(localhost),包含以下步骤:
注意:客户端有可能不需要用户交互,在第一次请求中就发送认证消息头。
客户端请求(没有认证信息):
GET /private/index.html HTTP/1.0 Host: localhost
服务端应答:
HTTP/1.0 401 Authorization Required Server: HTTPd/1.0 Date: Sat, 27 Nov 2004 10:18:15 GMT WWW-Authenticate: Basic realm="Secure Area" Content-Type: text/html Content-Length: 311 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"> <HTML> <HEAD> <TITLE>Error</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"> </HEAD> <BODY><H1>401 Unauthorized.</H1></BODY> </HTML>
客户端的请求(用户名“"Aladdin”,口令, password “open sesame”):
GET /private/index.html HTTP/1.0 Host: localhost Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
(跟随一个空行,如上所述)
Authorization消息头的用户名和口令的值可以容易地编码和解码:
use MIME::Base64; print encode_base64('Aladdin:open sesame'), "\n"; print decode_base64('QWxhZGRpbjpvcGVuIHNlc2FtZQ=='), "\n";
echo base64_encode("Aladdin:open sesame")."\n"; echo base64_decode("QWxhZGRpbjpvcGVuIHNlc2FtZQ==")."\n";
print "Aladdin:open sesame".encode("base64") print "QWxhZGRpbjpvcGVuIHNlc2FtZQ==".decode("base64")
require 'base64' puts Base64::encode64("Aladdin:open sesame") puts Base64::decode64("QWxhZGRpbjpvcGVuIHNlc2FtZQ==") 如果使用Ruby 2以上版本,請改用Base64.strict_encode64
$ echo -n "Aladdin:open sesame" | base64 QWxhZGRpbjpvcGVuIHNlc2FtZQ== $ echo -n "QWxhZGRpbjpvcGVuIHNlc2FtZQ==" | base64 -d Aladdin:open sesame
let $encode := util:base64-encode('Aladdin:open sesame') let $decode := util:base64-decode('QWxhZGRpbjpvcGVuIHNlc2FtZQ==')
$ printf "Aladdin:open sesame" | openssl enc -base64 QWxhZGRpbjpvcGVuIHNlc2FtZQ== $ echo "QWxhZGRpbjpvcGVuIHNlc2FtZQ==" | openssl enc -base64 -d Aladdin:open sesame $
HTTP/1.0 200 OK Server: HTTPd/1.0 Date: Sat, 27 Nov 2004 10:19:07 GMT Content-Type: text/html Content-Length: 10476
(跟随一个空行,随后是需凭据页的HTML文本)。