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…...

idea 快捷键运用
ctrl d 向下复制一行 shiftalt↑/↓ 向上或者向下移动光标所在行 shiftctrl↑/↓ 向上或者向下移动光标所在行(自动对齐) shift F6 rename包名或者类名或者批量修改变量名(不建议更改项目名,包名也尽量别改) 输入if 然后ctrlshift回车 补全缺失的括号 shift …...

k8s问题
文章目录 本地搭K8s集群 bilibili什么是声明式API?kubectl apply Etcd数据库有什么特性,为什么K8S选用了Etcd数据库?K8S中一个node的生命周期是怎样的?服务发现机制介绍docker的实现原理介绍如果只是使用Linux命名空间进行分离&am…...

串口通信问题排查总结
串口通信问题排查 排查原则: 软件从发送处理到接收处理,核查驱动、控制及发送接收数据是否正常。硬件从发送到接收,针对信号经过的各段,分段核对信号是否正常。示波器、逻辑分析仪。用万用表、示波器、逻辑分析仪等工具…...

【教学类-59-】专注力视觉训练01(圆点百数图)
背景需求: 视觉训练的神奇效果,让你的宝贝成为焦点 - 小红书魔法视觉追踪-视觉训练—— 🔍视觉训练🔍 🔹想要提高宝宝的专注力,视觉训练是个绝佳方法! 🔹让宝宝仔细观察数字的路线&a…...

C 语言实例 - 循环输出26个字母
循环输出 26 个字母。 以下例子我们用变量 letter 来存储当前要输出的字母,然后,使用 for 循环来重复 26 次输出字母,并在每个字母后面加一个空格。 循环内部使用 printf 函数来输出 letter 变量的值,%c 是 printf 的格式控制符…...

qt多语言翻译不生效的原因
假设您有QT语言家的基础知识,假设网上那些所有的问题您都已经排查过了,但依然翻译不生效,那么可以看下这篇帖子,其实就一个问题,变量的生命周期,假设QTranslator是一个函数内的变量,且没有被声明…...

springboot集成达梦数据库8,用springboot+mtbatisplus查询值为空
springboot集成达梦数据库8,用springbootmtbatisplus查询值为空 背景:springboot集成达梦数据库8,用springbootmtbatisplus查询值为空,但是在DB管理工具中是可以查询到数据的。 原因及解决方法:执行添加语句后…...

C语言-----指针数组 \ 数组指针
一 指针数组 用来存放指针的数组 int arr[10]; //整型数组 char ch[5]; //字符数组 int * arr[6]; //存放整型指针的数组 char * arr[5]; //存放字符指针的数组 // 指针数组的应用 int main() {int arr1[] { 1,2,3,4,5 };int arr2[] { 2,3,4,5,6 };int arr3[] { 3,4,…...

Go语言 gRPC 简述
参考文章: 聊聊gRPC的特性和背后设计的原则(一)-腾讯云开发者社区-腾讯云 grpc-我们为什么要用gRpc?gRpc快在哪里?_grpc 优点-CSDN博客 GRPC详解-CSDN博客 1. 什么是gRPC gRPC 是一个高性能 远程调用(RPC)框架&#…...

信息系统项目管理师0136:工具与技术(8项目整合管理—8.9结束项目或阶段—8.9.2工具与技术)
点击查看专栏目录 文章目录 8.9.2 工具与技术 8.9.2 工具与技术 专家判断 结束项目或阶段过程中,应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见,涉及领域包括:管理控制;审计;法规与采购…...