HTTP Digest Access Authentication Schema

HTTP Digest Access Authentication Schema

  • 背景
  • 介绍
  • Challenge
  • Response
  • 摘要计算
  • 流程
  • 总结
  • 参考

背景

本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。

介绍

HTTP Digest Access Authentication Schema,HTTP 摘要访问认证模式,是 HTTP 1.1 引入的替代 HTTP Basic Access Authentication Schema 的方案,为了解决 HTTP Basic Access Authentication Schema 中存在的安全问题:通过网络传输未加密的用户ID和密码

HTTP Digest 同 HTTP Basic 一样,基于 challenge-response 认证机制实现身份认证方案,不同之处在于,HTTP Digest 不会直接发送明文密码,而是采用 checksum 检验方式对请求进行验证。

HTTP Digest Access Authentication 中的 challenge 使用一个 nonce 值,一个有效的 response 包含的 checksum用户ID密码nonceHTTP请求方法HTTP请求URI 通过算法生成(默认 MD5),这样就永远不会以明文方式发送密码。

Challenge

服务器发送的 challengeDigest digest-challenge,其中 Digest 指明服务器需要的访问认证方式,digest-challenge 格式如下:

realm | [domain] | nonce | [opaque] | [stale] | [algorithm] | [qop-options] | [auth-param]

其中 realmnonce 这两个字段是必须的。字段说明:

  • realm:一个标识受保护资源的字符串,指示用户应该使用哪个用户ID和密码进行认证。此字符串至少应该包含执行认证的主机名称,还可以另外指示哪些用户集合可能具有访问权限,如:registered_users@somehost
  • domain: 授权访问的URI列表,每项之间以空格符分隔。
  • nonce:服务器每次返回 401 Unauthorized 时生成的唯一随机数,通常推荐使用 Base64 编码或十六进制数,实际依赖于服务器的具体实现。服务器向客户端发送 challenge 时会附带一个 nonce 随机数,客户端返回的 response 中摘要值计算会用到此 nonce 值。nonce 的存在增加了破解密码的难度,防范了 中间人恶意服务器 等攻击类型。RFC 2617建议生成随机数的计算公式:nonce=Base64(timestamp MD5(timestamp:ETag:private-key))
  • opaque:服务器指定的一个数字字符串,客户端后续发送的对相同域(realm)的访问请求中,HTTP Headers 的 Authorization 应带有此值(保持不变),通常推荐使用 Base64 编码或十六进制数据。
  • stale:一个标识,表明客户端的上一请求中使用了过期的 nonce 值。如果为 TRUE 则提示客户端使用新的加密 response 值重试请求。只有当服务器收到一个 nonce 过期的请求,但该 nonce 有一个有效的摘要(表明客户端知道正确的用户ID和密码)时,服务器才应该将 stale 设置为 TRUE
  • algorithm:一个字符串,指明生成摘要和校验和(checksum)的算法,如果没有设置则默认采用 MD5。
  • qop:quality of protection,质量保护,包含 authauth-int 两种策略,默认 authauth-int 增加了报文完整性检测。
  • auth-param:为未来扩展保留。

Response

客户端发送的 responseDigest digest-response,其中 Digest 指明客户端遵从的访问认证方式,digest-response 格式如下:

username | realm | nonce | digest-uri | response | [algorithm] | [cnonce] | [opaque] | [message-qop] | [nonce-count] | [auth-param]

字段说明:

  • username:用于特定域(realm)认证的用户ID。
  • digest-uri:请求的相对URI,因为代理在传输过程中可能修改请求,所以此处重复说明。
  • response:摘要,是由32位十六进制数字组成的字符串,证明客户端知道密码。
  • qop:同 challengeqop 用途一致,必须是服务器发送的 challenge 中指明支持的 qop 之一,此值会影响摘要计算。
  • cnonce:客户端随机数,使得双方都可以查验对方的身份,并对消息的完整性提供一些保护。
  • ncnonce 计数器,是一个十六进制的数值,表示同一 nonce 下客户端发送出请求的数量,在第一个 response 请求中 nc=00000001,目的是让服务器保持这个计数器的一个副本,以便检测重复的请求。
  • auth-param:为未来扩展保留。

摘要计算

response 的值由三步计算而成,使用冒号作为分隔符合并多个数值:

  1. 对用户ID、域(realm)及密码的合并值计算MD5哈希,结果称为 HA1(安全相关)。
    • 如果算法是 MD5,则 A1=<userid>:<realm>:<password>
    • 如果算法是 MD5-sess,则 A1=MD5(<user>:<realm>:<password>):<nonce>:<cnonce>
    HA1 = MD5(A1) = MD5(username:realm:password)
    
  2. 对 HTTP 方法以及 URI 的摘要的合并值计算 MD5 哈希,如 GET/dir/index.html,结果称为 HA2(报文相关)。A2 表示是与报文自身相关的信息,比如 URL,A2 加入摘要计算的主要目的是有助于防止反复。
    • qop 为指定或指定为 auth,则 A2=<request-method>:<uri-directive-value>
    HA2 = MD5(A2) = MD5(method:digestURI)
    
    • qop 指定为 auth-int,则 A2=<request-method>:<uri-directive-value>:MD5(<request-entity-body>)
    HA2 = MD5(A2) = MD5(method:digestURI:MD5(entityBody))
    
  3. HA1noncenccnonceqop 以及 HA2 的合并值计算 MD5 哈希,结果即为客户端提供的 response 值,计算规则:
    • qop 没有指定,则 response = MD5(HA1:nonce:HA2)
    • qop 指定为 authauth-int,则 response = MD5(HA1:nonce:nonceCount:clientNonce:qop:HA2)

流程

HTTP Digest Access Authentication Schema

  1. 客户端请求访问受保护资源;
  2. 服务端接收到请求后,在请求头部(HTTP Request Headers)中未找到 Authorization,返回 401 Unauthorized,返回响应头(HTTP Response Headers)中带有 WWW-Authenticate
    WWW-Authenticate: Digest realm="testrealm@host.com", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"
    
  3. 客户端收到服务器响应后,使用 用户ID密码nonceHTTP请求方法HTTP请求URI,通过指定算法(如默认的 MD5)计算生成一个摘要,将此摘要与认证请求一起发送给服务器进行认证。客户端发送的认证请求中包含 Authorization 头信息,格式如下:
    Authorization: Digest username="Mufasa", realm="testrealm@host.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="/dir/index.html", qop=auth, nc=00000001, cnonce="0a4f113b", response="6629fae49393a05397450978507c4ef1", opaque="5ccc069c403ebaf9f0171e9517f40e41"
    
    其中 response 的计算过程:
    HA1 = MD5("Mufasa:testrealm@host.com:Circle Of Life") = 939e7578ed9e3c518a452acee763bce9
    HA2 = MD5("GET:/dir/index.html") = 39aff3a2bab6126f332b942af96d3366
    response = MD5("939e7578ed9e3c518a452acee763bce9:dcd98b7102dd2f0e8b11d0f600bfb0c093:00000001:0a4f113b:auth:39aff3a2bab6126f332b942af96d3366") = 6629fae49393a05397450978507c4ef1
    
  4. 服务器收到客户端的认证请求后,使用存储的密码和发送的参数计算摘要,如果与客户端发送的摘要匹配则认证成功。成功认证后,服务器可以返回 Authentication-Info 响应头,格式:
    Authentication-Info: nextnonce | [message-qop] | [response-auth] | [cnonce] | [nonce-count]
    
    字段说明:
    • nextnonce:如果服务器返回 nextnonce,则客户端下次请求的头信息中 Authorizationnonce 需要设置为此值,否则可能导致服务器要求重新认证。
    • message-qop:服务器应用与响应的 qopauth 表示认证,auth-int 表示完整性认证保护,应该与对应的客户端请求中 qop 值一致。
    • response-auth:支持双向身份认证,即表明服务器知道用户的密码。
    • cnonce:同 responsecnonce
    • nonce-count:同 responsenc

注意:

  • 后续客户端可以提交新请求,重复使用服务器密码随机数(nonce),服务器仅在每次响应 401 Unauthorized 时发送新的 nonce
  • 后续请求中,十六进制请求计数器(nc)必须比前一次要大,否则攻击者可以使用同样的认证信息重放已有的请求。
  • 服务器应当记住最近生成的密码随机数(nonce),也可以为每一个密码随机数分配一个过期时间,如果客户端请求中携带的是过期的密码随机数,则服务器响应 401 Unauthorized,并在 digest-challenge 中添加 stale=TRUE,表明客户端应该使用新的密码随机数重发请求。

总结

HTTP Digest 相比于 HTTP Basic 的优势:

  • 不发送明文密码;
  • 使用随机数 nonce 防止重放攻击。

HTTP Digest 的缺陷:

  • 如果摘要数据被攻击者截获,密码可能会被离线破解;
  • 不提供消息完整性和机密性保护,最好配合 HTTPS 使用。

参考

[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication](RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/336381.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 控件保持宽高比得几种方式

文章目录 Android 控件保持宽高比得几种方式adjustViewBounds百分比布局ConstraintLayout自定义View Android 控件保持宽高比得几种方式 adjustViewBounds 仅适用于 ImageView&#xff0c;保持横竖比。 <ImageViewandroid:layout_width"match_parent"android:l…

STL-priority_queue的使用及其模拟实现

优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器&#xff0c;在vector上又使用了堆算法将vector中的元素构造成堆的结构&#xff0c;因此priority_queue就是堆&#xff0c;所有需要用到堆的位置&#xff0c;都可以考虑使用priority_queue。 注意&#xff1…

车载电子电器架构 —— 智能座舱标准化意义

车载电子电器架构 —— 智能座舱标准化意义 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消…

Python 之微信指数小程序数据抓取

Fiddler安装和设置 安装 Fiddler 安装包可以从这里获取&#xff0c;如果失效了可以自己网上找一个安装。 链接&#xff1a;https://pan.baidu.com/s/10tYQ-uL6HMddkOcIKnWEKQ?pwdd1io 然后就是点击安装就好了&#xff0c;没什么好多说的。 启用HTTPS捕获 进入软件界面&…

数据库设计实例---学习数据库最重要的应用之一

一、引言【可忽略】 在学习“数据库系统概述”这门课程时&#xff0c;我一直很好奇&#xff0c;这样一门必修课&#xff0c;究竟教会了我什么呢&#xff1f; 由于下课后&#xff0c;&#xff0c;没有拓展自己的眼界&#xff0c;上课时又局限于课堂上老师的讲课水平&#xff0c;…

【YOLOv10】2024年5月最新的YOLO系列模型Yolov10(论文阅读笔记) + 完整创新点说明 + 总结

&#x1f680;&#x1f680;&#x1f680; YOLOv10: 实时端到端的目标检测。YOLOv10比最先进的YOLOv9延迟时间更低&#xff0c;测试结果可以与YOLOv9媲美&#xff0c;可能会成为YOLO系列模型部署的“新选择”。 官方论文地址&#xff1a;https://arxiv.org/pdf/2405.14458 官方…

[vue3后台管理二]首页和登录测试

[vue3后台管理二]首页和登录测试 1 修改main.js import ./assets/main.cssimport { createApp } from vue import App from ./App.vue import router from ./router createApp(App).use(router).mount(#app)2 路由创建 import {createRouter, createWebHistory} from vue-ro…

C++ 网络编程

一、Reactor 网络编程模型 reactor 是一个事件处理模型。网络处理:因为用户层并不知道 IO 什么时候就绪,所以将对 IO 的处理转化为对事件的处理。网络模型构成: 非阻塞 IO:操作 IO,如果 IO 未就绪,IO 函数会立刻返回。IO 多路复用:检测多路 IO 是否就绪。工作流程: 注册…

浅谈路由器转发数据包

当路由器转发数据包时&#xff0c;它会经历一系列步骤&#xff0c;包括接收数据包、路由表查询、以及转发数据包。以下是详细的步骤描述&#xff1a; 1. 接收数据包 以太网帧到达端口&#xff1a;当一个以太网帧到达路由器的某个网络接口&#xff08;端口&#xff09;时&#…

Django 做migrations时出错,解决方案

在做migrations的时候&#xff0c;偶尔会出现出错。 在已有数据的表中新增字段时&#xff0c;会弹出下面的信息 运行这个命令时 python manage.py makemigrationsTracking file by folder pattern: migrations It is impossible to add a non-nullable field ‘example’ to …

旧手机翻身成为办公利器——PalmDock的介绍也使用

旧手机有吧&#xff01;&#xff01;&#xff01; 破电脑有吧&#xff01;&#xff01;&#xff01; 那恭喜你&#xff0c;这篇文章可能对你有点用了。 介绍 这是一个旧手机废物利用变成工作利器的软件。可以在 Android 手机上快捷打开 windows 上的文件夹、文件、程序、命…

鸿蒙时间滑动选择器弹窗

例子&#xff1a; Button(打开弹窗).fontSize(14).width(106).height(32).padding({ left: 0, right: 0 }).fontColor(#999).onClick(()>{DatePickerDialog.show({selected:new Date(),onDateAccept:(value)>{AlertDialog.show({ message:JSON.stringify(value) })}})}) …

“Excel+中文编程”衍生新型软件,WPS用户:自家孩子

你知道吗&#xff0c;我们中国人有时候真的挺有创新精神的。 你可能熟悉Excel表格&#xff0c;也可能听说过中文编程&#xff0c;但你有没有脑洞大开&#xff0c;想过如果把这两者结合起来&#xff0c;会碰撞出什么样的火花呢&#xff1f; 别不信&#xff0c;跟着我来看看吧&a…

实时通信的方式——WebRTC

文章目录 基于WebRTC实现音视频通话P2P通信原理如何发现对方&#xff1f; 不同的音视频编解码能力如何沟通&#xff1f;&#xff08;媒体协商SDP&#xff09;如何联系上对方&#xff1f;&#xff08;网络协商&#xff09; 常用的API音视频采集getUserMedia核心对象RTCPeerConne…

raid配置与实战10

一、raid理论 1、raid概述 raid&#xff08;磁盘阵列&#xff09;&#xff1a;是用不同的硬盘分区&#xff0c;组成一个逻辑上的硬盘&#xff0c;高可用&#xff08;冗余&#xff09;。 2、raid级别 2.1、raid0条带化存储 数据分散在多个物理磁盘上的存储方式&#xff0c;…

vue3学习(四)

前言 接上篇学习笔记&#xff0c;分享3个内置组件&#xff1a;动态组件、缓存组件、分发组件基本用法。大家一起通过code的示例&#xff0c;从现象理解,注意再次理解生命周期。 一、code示例 组件A&#xff1a;CompA <script setup> import {onMounted, onUnmounted} f…

linux Inodes满导致数据库宕机

项目经理反馈集群环境中有个节点无法使用了需要支援下&#xff0c;同时发过来截图说明磁盘还是有空的。 登录系统后直接发现问题 orcl2:/home/oracledb2> sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed May 29 13:59:21 2024 Copyright (c) 1982,…

民国漫画杂志《时代漫画》第32期.PDF

时代漫画32.PDF: https://url03.ctfile.com/f/1779803-1248635561-0ae98a?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

类的内存对齐位段位图布隆过滤器哈希切割一致性哈希

文章目录 一、类的内存对齐1.1规则1.2原因 二、位段2.1介绍2.2内存分配问题2.3跨平台问题2.4使用的注意事项 三、位图的应用3.1 给40亿个不重复的无符号整数&#xff0c;找给定的一个数。&#xff08;int的范围可以到达42亿多&#xff09;3.2 给定100亿个整数&#xff0c;设计算…

记录github小程序短视频系统的搭建过程

GitHub - lkmc2/AwesomeVideoWxApp: 《倾心短视频》微信小程序 这个项目按readme中的来可以部署成功&#xff0c;但是会发现图片、视频全是空的&#xff0c;如下图&#xff1a; 修改源代码&#xff0c;更换图片上传与保存地址 大概涉及到这些代码块&#xff0c;进行更改即可。…