在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优点
  • 2缺点
  • 3例子
  • 4参考文献和注释
  • 5参见
  • 6外部链接

优点[编辑]

基本认证的一个优点是基本上所有流行的网页浏览器都支持基本认证[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==")
如果使用Ruby 2以上版本,請改用Base64.strict_encode64
  • 用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文本)。

参考文献和注释[编辑]

  1. ^ 这里的“所有的流行网页浏览器”包括任何当前市场份额超过0.2%的网页浏览器,参见网页浏览器比较了解网页浏览器对HTTP的支持
  2. ^ [1]

参见[编辑]

  • HTTP摘要认证

外部链接[编辑]

  • RFC2617: HTTP Authentication: Basic and Digest Access Authentication

HTTP basic auth相关推荐

  1. Nginx配置Basic Auth登录认证的实现方法

    这篇文章主要介绍了Nginx配置Basic Auth登录认证的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 有时候我们通过nginx搭建了一台文件服务器, 一般 ...

  2. 配置kubernetes服务basic auth

    由于一些内部服务访问并不需要鉴权,如kubernetes-dashboard.traefik-ui,所以当我们想通过外网域名访问的时候会有安全问题.这里我们可以为服务配置basic auth,访问时需 ...

  3. nginx basic auth配置踩坑记

    nginx的basic auth配置由ngx_http_auth_basic_module模块提供,对HTTP Basic Authentication协议进行了支持,用户可通过该配置设置用户名和密码 ...

  4. Nginx下配置Http Basic Auth

       nginx basic auth指令 第一条语句: 语法:     auth_basic string | off; 默认值:     auth_basic off; 配置段:     http ...

  5. 微信小程序中通过Basic Auth传递token

    npm导入用于Base64加密的工具包js-base64 // package.js "dependencies": {"js-base64": "^ ...

  6. 【HTTP】HTTP Authorization 之 Basic Auth 和 X-Auth-Token

    Basic Authorization 认证方法 https://segmentfault.com/a/1190000017563615 HTTP Basic Authorization https: ...

  7. 用 PHP 进行 HTTP 认证,Basic Auth

    实现基本的简单Basic Auth认证. php手册 可以用 header() 函数来向客户端浏览器发送"Authentication Required"信息,使其弹出一个用户名/ ...

  8. 基于 Traefik 的 Basic Auth 配置

    前言 Traefik是一个现代的HTTP反向代理和负载均衡器,使部署微服务变得容易. Traefik可以与现有的多种基础设施组件(Docker.Swarm模式.Kubernetes.Marathon. ...

  9. Rest Api 项目添加 Basic Auth 认证

    title: Rest Api 项目添加 Basic Auth 认证 date: 2022-10-10 22:09 tags: [Java,Spring Boot,Rest Api,Basic Aut ...

  10. Basic Auth 和 OAuth的区别

    开放平台有两种认证方式,一种是Basic Auth,一种是OAuth. 关于OAuth1,OAuth2的异同  移步->> https://blog.csdn.net/qq_1502829 ...

最新文章

  1. 8086汇编语言命令速查与详解
  2. Lync Server 2013与OWA的集成
  3. (WPF, MVVM) Event 处理
  4. python 如何将代码打包成exe可执行程序?(导出为exe可执行文件)pyinstaller
  5. JVM基于栈的解释器执行原理
  6. 机器学习入门04-线性回归原理与java实现多元线性回归
  7. 关于移动手机端富文本编辑器qeditor图片上传改造
  8. 职业高中计算机网络试讲稿,2021教师资格证考试面试高中信息技术试讲稿——《建立数据库的基本过程》...
  9. Spring IOC容器和Bean的配置
  10. Protobuf C++类中成员函数GetCachedSize()与ByteSize()的区别
  11. 网易云计算机系统有限公司,网易云音乐
  12. Linux根目录解析
  13. 电脑系统声音怎么录制 如何录制电脑内部音频
  14. 读研,选择高校 or 研究所?
  15. java 实现短信验证码
  16. java让一个方法等待_如何写一个“等待”的方法?
  17. 员工激励对组织绩效的影响
  18. ubuntu找不到无线网络
  19. 后TOS时代的码头数字化生产力
  20. 876. 链表的中间结点 (Python 实现)

热门文章

  1. python交互模式设置及VIM的tab补齐
  2. Linux高性能server编程——高级I/O函数
  3. 多进程与多线程(1)
  4. CodeForces - 1535C Unstable String(思维)
  5. CodeForces - 906E Reverses(回文自动机+Palindrome Series优化dp)
  6. CodeForces - 1359C Mixing Water(三分)
  7. SPOJ - NSUBSTR Substrings(后缀自动机)
  8. Keras-数据增广
  9. 安卓进阶系列-08异步加载AsynsTask使用
  10. Adler-32校验算法