HTTP基本认证

HTTP 中,基本认证 是一种用来允许Web浏览器 ,或其他客户端程序在请求时提供以用户名口令 形式的凭证。

在发送之前,用户名追加一个冒号然后串接 上口令。得出的结果字符串 再用Base64 算法编码。例如,用户名是Aladdin ,口令是open sesame ,拼接后的结果是Aladdin:open sesame ,然后再用Base64编码,得到QWxhZGRpbjpvcGVuIHNlc2FtZQ== 。Base64编码的字符串发送出去,并由接收者解码,得到一个由冒号分隔的用户名和口令的字符串。

虽然对用户名和口令用Base64算法加密通常使得肉眼难以识别,但可以很容易地被解码,就像容易编码一样。编码这一步骤的目的不是安全,而是将用户名和口令中的非HTTP兼容的字符变为HTTP兼容的字符。

最初,基本认证是定义在HTTP1.0规范(RFC 1945 )中,后续的有关安全的信息可以在HTTP1.1规范(RFC 2616 )和HTTP认证规范(RFC 2617 )找到。

 

优点

基本认证的一个优点是所有流行的网页浏览器都支持基本认证。[1] 基本认证很少在可公开访问的互联网 网站 上使用,有时候在小的私有系统中使用。后来的机制,HTTP摘要认证 是为提到基本认证而开发的,允许密钥以相对安全的方式在不安全的通道上传输。

程序员和系统管理员有时会在可信网络环境中使用基本认证,使用Telnet 或其他明文网络协议工具手动地测试Web服务器。这是一个麻烦的过程,但是网络上传输的内容是人可读的,以便进行诊断。

缺点

虽然基本认证非常容易实现,但该方案建立在以下的假设的基础上,即:客户端和服务器主机之间的连接是安全可信的。特别是,如果没有使用SSL/TLS 这样的传输层安全的协议,那么以明文 传输的密钥和口令很容易被拦截。该方案同样没有对服务器返回的信息提供保护。

现存的浏览器保存认证信息直到标签页或浏览器被关闭,或者用户清除历史记录。[2] HTTP没有为服务器提供一种方法指示客户端丢弃这这些被缓存的密钥。这意味着服务端其没有一种有效的方法来登出,无需关闭浏览器。

例子

这一个典型的HTTP客户端和HTTP服务器的对话,服务器安装在同一台计算机上(localhost),包含以下步骤:

  • 客户端请求一个需要身份认证的页面,但是没有提供用户名和口令。这通常是用户在地址栏输入一个URL,或是打开一个指向该页面的链接
  • 服务端响应一个401应答码,并提供一个认证域。
  • 接到应答后,客户端显示该认证域(通常是所访问的计算机或系统的描述)给用户并提示输入用户名和口令。此时用户可以确定取消。
  • 用户输入了用户名和口令后,客户端在原先的请求上添加了认证消息头(值是base64encode(username+":"+password) ),然后重新发送。
  • 在本例中,服务器接受了认证并返回了页面。如果用户名非法或口令不对,服务器可能返回401应答码,客户端可以再次提示用户输入口令。

注意: 客户端可能不需要用户交互,在第一次请求中就发送认证消息头。


客户端请求(没有认证信息) :

GET /private/index.html HTTP/1.0
Host: localhost

(跟随一个换行 ,以回车(CR)换行(LF) 的形式)

服务端应答 :

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消息头的用户名和口令的值可以容易地编码和解码:

用Perl:

use
 MIME::
Base64
;

print
 encode_base64(
'Aladdin:open sesame'
)
,
 "/n
"
;

print
 decode_base64(
'QWxhZGRpbjpvcGVuIHNlc2FtZQ=='
)
,
 "/n
"
;

用PHP:

echo
 base64_encode
(
"Aladdin:open sesame"
)
.
"/n
"
;

echo
 base64_decode
(
"QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
)
.
"/n
"
;

用Python:

print
 "Aladdin:open sesame"
.encode
(
"base64"
)

print
 "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
.decode
(
"base64"
)

用Ruby:

require
 'base64'

puts
 Base64
::encode64(
"Aladdin:open sesame"
)

puts
 Base64
::decode64(
"QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
)

用Bash

$ echo
 -n
 Aladdin:open sesame |
 base64
QWxhZGRpbjpvcGVuIHNlc2FtZQ
==
$ echo
 -n
 QWxhZGRpbjpvcGVuIHNlc2FtZQ
== |
 base64 -d

Aladdin:open sesame

用XQuery (eXist-db):

let $encode :=  util:base64-encode('Aladdin:open sesame')
let $decode := util:base64-decode('QWxhZGRpbjpvcGVuIHNlc2FtZQ==')

OpenSSL :

$ 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文本)。

参见

外部链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值