千家信息网

基于HTTP 协议认证介绍与实现

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,导言一直对http 的头认证有兴趣,就是路由器的那种弹出对话框输入账号密码怎么实现一直不明白,最近,翻了一下http 协议,发现这是一个RFC 2617的实现,所以写篇文章介绍一下吧.Http基本认证
千家信息网最后更新 2025年01月20日基于HTTP 协议认证介绍与实现

一直对http 的头认证有兴趣,就是路由器的那种弹出对话框输入账号密码怎么实现一直不明白,最近,翻了一下http 协议,发现这是一个RFC 2617的实现,所以写篇文章介绍一下吧.

这是一个用于web浏览器或其他客户端在请求时提供用户名和密码的登录认证,要实现这个认证很简单:

我们先来看下协议里面怎么定义这个认证的. 1. 编码: 将用户名 追加一个 冒号(':')接上密码,把得出的结果字符串在用Base64算法编码.

  1. 请求头: Authorization: 认证类型 编码字符串

来看一下客户端如何发起请求例如,有一个用户名为:tom, 密码为:123456 怎么认证呢?

步骤如下 1. 编码

Base64('tom:123456') == dG9tOjEyMzQ1Ng==;

  1. 把编码结果放到请求头当中

    Authorization: Basic dG9tOjEyMzQ1Ng==


请求样例客户端

GET / HTTP/1.1Host: localhostAuthorization: Basic dG9tOjEyMzQ1Ng

服务端应答

HTTP/1.1 200 OKDate: Thu, 13 Jun 2013 20:25:37 GMTContent-Type: application/json; charset=utf-8Content-Length: 53

如果没有认证信息

HTTP/1.1 401 Authorization RequiredDate: Thu, 13 Jun 2013 20:25:37 GMTWWW-Authenticate: Basic realm="Users"

验证失败的时候,响应头加上WWW-Authenticate: Basic realm="请求域".


这种http 基本实现,几乎目前所有浏览器都支持.不过,大家可以发现,直接把用户名和密码只是进行一次base64 编码实际上是很不安全的,因为对base64进行反编码十分容易,所以这种验证虽然简便,但是很少会在公开访问的互联网使用,一般多用在小的私有系统,例如,你们家里头的路由器,多用这种认证方式.

这个认证可以看做是基本认证的增强版本,使用随机数+密码进行md5,防止通过直接的分析密码MD5防止破解. 摘要访问认证最初由 RFC 2069 (HTTP的一个扩展:摘要访问认证)中被定义加密步骤:

后来发现,就算这样还是不安全(md5 可以用彩虹表进行***),所以在RFC 2617入了一系列安全增强的选项;"保护质量"(qop)、随机数计数器由客户端增加、以及客户生成的随机数。这些增强为了防止如选择明文***的密码分析。

  1. 如果 qop 值为"auth"或未指定,那么 HA2 为

  2. 如果 qop 值为"auth-int",那么 HA2 为

  3. 如果 qop 值为"auth"或"auth-int",那么如下计算 response:

  4. 如果 qop 未指定,那么如下计算 response:

好了,知道加密步骤,下面我们用文字来描述一下;

最后,我们的response 由三步计算所得. 1. 对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。

HA1 = MD5( "tom:Hi!:123456" ) = d8ae91c6c50fabdac442ef8d6a68ae8c

  1. 对HTTP方法以及URI的摘要的合并值计算 MD5 哈希值,例如,"GET" 和 "/index.html",结果称为 HA2。

    HA2 = MD5( "GET:/" ) = 71998c64aea37ae77020c49c00f73fa8

  2. 最后生成的响应码

    Response = MD5("d8ae91c6c50fabdac442ef8d6a68ae8c:L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3:00000001:c2dc5b32ad69187a
    :auth:71998c64aea37ae77020c49c00f73fa8") = 2f22e6d56dabb168702b8bb2d4e72453;

RFC2617 的安全增强的主要方式:

发起请求的时候,服务器会生成一个密码随机数(nonce)(而这个随机数只有每次"401"相应后才会更新),为了防止***者可以简单的使用同样的认证信息发起老的请求,于是,在后续的请求中就有一个随机数计数器(cnonce),而且每次请求必须必前一次使用的打.这样,服务器每次生成新的随机数都会记录下来,计数器增加.在RESPONSE 码中我们可以看出计数器的值会导致不同的值,这样就可以拒绝掉任何错误的请求.

请求样例(服务端 qop 设置为"auth")

客户端 无认证

GET / HTTP/1.1Host: localhost

服务器响应(qop 为 'auth')

HTTP/1.1 401 Authorization RequiredDate: Thu, 13 Jun 2013 20:25:37 GMTWWW-Authenticate: Digest realm="Hi!", nonce="HSfb5dy15hKejXAbZ2VXjVbgNC8sC1Gq", qop="auth"

客户端请求(用户名: "tom", 密码 "123456")

GET / HTTP/1.1Host: localhostAuthorization: Digest username="tom",                     realm="Hi!",                     nonce="L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3",                     uri="/",                     qop=auth,                     nc=00000001,                     cnonce="c2dc5b32ad69187a",                     response="2f22e6d56dabb168702b8bb2d4e72453"

服务端应答

HTTP/1.1 200 OKDate: Thu, 13 Jun 2013 20:25:37 GMTContent-Type: application/json; charset=utf-8Content-Length: 53

注意qop 设置的时候慎用:auth-int,因为一些常用浏览器和服务端并没有实现这个协议.


认证 密码 客户 编码 随机数 服务 客户端 用户 用户名 安全 摘要 结果 计数器 生成 时候 服务器 步骤 浏览器 浏览 信息 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 计算机二级 软件开发 app租用什么服务器 我的世界电脑版ac服务器 网络服务器老掉线 软件开发定制外包6 表情包服务器后台管理采集 数据库 年龄最大的两名 昌平区口碑好的软件开发诚信服务 方舟手游怎样卡服务器 上海工程软件开发发展 国家网络安全应急预案 数据库表修改字符串的某个字符 学校机房服务器怎么安装 网络安全舆情会议记录 米家数据库是什么意思 单机手游需不需要服务器 web服务器默认的文档 服务器硬盘一直显示不正常 如何用cmd服务器管理器 网络安全校园公益主题海报漫画 服务器管理器仪表盘怎么设置 网络安全宣传周活动全面启动 远端服务器配置异常 是什么意思 网络技术都包括什么 江苏加工软件开发试验设备 信息技术数据库研究 青浦区创新数据库服务商活动简介 软件开发在线辅导 天津手动软件开发调试 乐视软件开发工资一般多少
0