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、密码、nonce、HTTP请求方法 和 HTTP请求URI 通过算法生成(默认 MD5),这样就永远不会以明文方式发送密码。
Challenge
服务器发送的 challenge:Digest digest-challenge,其中 Digest 指明服务器需要的访问认证方式,digest-challenge 格式如下:
realm | [domain] | nonce | [opaque] | [stale] | [algorithm] | [qop-options] | [auth-param]
其中 realm 和 nonce 这两个字段是必须的。字段说明:
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,质量保护,包含auth和auth-int两种策略,默认auth,auth-int增加了报文完整性检测。auth-param:为未来扩展保留。
Response
客户端发送的 response:Digest 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:同 challenge 中qop用途一致,必须是服务器发送的 challenge 中指明支持的qop之一,此值会影响摘要计算。cnonce:客户端随机数,使得双方都可以查验对方的身份,并对消息的完整性提供一些保护。nc:nonce计数器,是一个十六进制的数值,表示同一nonce下客户端发送出请求的数量,在第一个 response 请求中nc=00000001,目的是让服务器保持这个计数器的一个副本,以便检测重复的请求。auth-param:为未来扩展保留。
摘要计算
response 的值由三步计算而成,使用冒号作为分隔符合并多个数值:
- 对用户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) - 如果算法是 MD5,则
- 对 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)) - 若
- 对
HA1、nonce、nc、cnonce、qop以及HA2的合并值计算 MD5 哈希,结果即为客户端提供的 response 值,计算规则:- 若
qop没有指定,则response = MD5(HA1:nonce:HA2) - 若
qop指定为auth或auth-int,则response = MD5(HA1:nonce:nonceCount:clientNonce:qop:HA2)
- 若
流程

- 客户端请求访问受保护资源;
- 服务端接收到请求后,在请求头部(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" - 客户端收到服务器响应后,使用
用户ID、密码、nonce、HTTP请求方法和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 - 服务器收到客户端的认证请求后,使用存储的密码和发送的参数计算摘要,如果与客户端发送的摘要匹配则认证成功。成功认证后,服务器可以返回
Authentication-Info响应头,格式:
字段说明:Authentication-Info: nextnonce | [message-qop] | [response-auth] | [cnonce] | [nonce-count]nextnonce:如果服务器返回nextnonce,则客户端下次请求的头信息中Authorization的nonce需要设置为此值,否则可能导致服务器要求重新认证。message-qop:服务器应用与响应的qop,auth表示认证,auth-int表示完整性认证保护,应该与对应的客户端请求中qop值一致。response-auth:支持双向身份认证,即表明服务器知道用户的密码。cnonce:同 response 中cnonce。nonce-count:同 response 中nc。
注意:
- 后续客户端可以提交新请求,重复使用服务器密码随机数(
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 Digest Access Authentication Schema
HTTP Digest Access Authentication Schema 背景介绍ChallengeResponse摘要计算流程总结参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。 介绍 HTTP Digest Access Authentication Schemaÿ…...
MySql超大Sql文件导入效率优化
对于MySQL中超大SQL文件的导入,效率优化是至关重要的,因为不当的操作可能导致导入过程耗时过长,甚至失败。以下是一些建议来优化MySQL超大SQL文件的导入效率: 调整max_allowed_packet参数: 这个参数定义了MySQL服务器和…...
【leetcode1944--队列中可以看到的人数】
有n人排成一个队列,从左到右编号为0到n-1,height数组记录每个人的身高,返回一个数组,记录每个人能看到几个人。 类比:山峰问题,高的后面的矮的看不见。 从后往前,最后一个元素入栈,…...
基于51单片机的室内空气质量检测-仿真设计
本设计是基于单片机的空气质量检测设计,主要实现以下功能: 可实现通过SGP30测量二氧化碳及甲醛浓度,当超过设置的最大值时,进行报警及通风和净化空气处理 可实现通过MQ-4测量甲烷浓度,当超过设置的最大值时࿰…...
day22二叉树part08 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
**235. 二叉搜索树的最近公共祖先 ** 这里利用上了二叉搜索树的特性,从上到下遍历,最近的公共祖先一定是满足p->val < root->val < q->val的 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, Tr…...
【Linux】Linux环境基础开发工具_2
文章目录 四、Linux环境基础开发工具2. vimvim的常见模式 未完待续 四、Linux环境基础开发工具 2. vim vim 是Linux下的一款 多模式编辑器 ,可以用来写代码,是 vi 的升级版。 此时无法输入,需要切换模式。 如上图,i 就是切换成…...
长方形边框 上方中间有缺口 css
<div class"text_6">大234234师掌4234柜</div><div class"text-wrapper_1"><span class"paragraph_1">四川慧创云戈科技有限公司推出的“大师掌柜”,是一个以餐饮外卖为切入口,专注实体小店新零售…...
2024-05-29 架构-程序设计-思考
摘要: 最近在抽出时间做一个数据库的driver, 其中有些问题驱动的软件代码的思考,是很值得回味的。 做的系统,所思考的问题,所设计的解决方案,其实都是可以看作是对解决问题方式。而不仅仅是某个类库的API的使用,某个…...
关于网络的基础知识
大家好,在当今数字时代,网络已经成为我们生活中不可或缺的一部分,它连接着世界的每一个角落,让信息、资源和人们彼此之间无阻碍地交流和共享。然而,对于许多人来说,网络仍然是一个神秘而复杂的领域…...
CTF网络安全大赛简单web题目:eval
题目来源于:bugku 题目难度:简单 一道简单web的题目 题目源代码: <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> 这个PHP脚本有几个关键部分,但…...
Linux通过 SSH 使用 rsync 进行文件传输
目录 目的整体思路ssh建立连接A服务器上的操作输入 ssh-keygen 生成密钥对查看公钥 B服务器上的操作设置公钥认证 A服务器上的操作使用SSH登录进行测试 同步数据知识拓展SSH(Secure Shell)rsync(Remote Sync) 目的 使用SSH&#…...
【保姆级介绍下Foxmail 邮箱】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
ABAP MD04增强排除MRP元素
场景 MD04跑出来很多MRP元素,用户想手工控制某些MRP元素不参与运算 分析 增强点还蛮好找的,控制MRP元素是否参与运算用下面的se19三代增强点就可以,打个断点看下MD04进的哪个增强点就行 旧版本的用这个:MD_CHANGE_MRP_DATA 新…...
构建一个简单的情感分析器:使用Python和spaCy
构建一个简单的情感分析器:使用Python和spaCy 引言 情感分析是自然语言处理(NLP)中的一项重要技术,它可以帮助企业和研究人员理解公众对特定主题或产品的看法。 在本篇文章中,我们将使用Python编程语言和 spaCy 库来构…...
数据库设计实例---学习数据库最重要的应用之一
一、引言【可忽略】 在学习“数据库系统概述”这门课程时,我一直很好奇,这样一门必修课,究竟教会了我什么呢? 由于下课后,,没有拓展自己的眼界,上课时又局限于课堂上老师的讲课水平,…...
数据结构算法题day05
数据结构算法题day05 题目算法思想代码运行代码 题目 从有序表中删除所有其值重复的元素,使表中所有元素的值均不同。算法思想 第一个元素(不重复)依次向后扫描,不重复就保留,重复(不保留)就删…...
关于《Java并发编程之线程池十八问》的补充内容
一、写在开头 在上一篇文章我们写《Java并发编程之线程池十八问》的时候,鉴于当时的篇幅已经过长,很多内容就没有扩展了,在这篇文章里对一些关键知识点进行对比补充。 二、Runnable vs Callable 在创建线程的时候,一般会选用 Runnable 和 Callable 两种方式。 【源码对…...
扒出秦L三个槽点,我不考虑买它了
文 | Auto芯球 作者 | 雷慢 比亚迪的有一个王炸“秦L”,再一次吸引了我注意力, 我上一辆车刚卖不久,最近打算买第二辆车, 二手车和新车都有在看, 我又是一个坚定的实用主义者, 特别是现在的经济环境不…...
【408真题】2009-28
“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…...
LeetCode---链表
203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 代码示例1:(直接使用原来的链表来进行移除节点操作) //时间复杂度: O(n) //空间复杂度: O(1) class Solu…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
