当前位置: 首页 > news >正文

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 Digest Access Authentication Schema

HTTP Digest Access Authentication Schema 背景介绍ChallengeResponse摘要计算流程总结参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得&#xff0c;并非原创&#xff0c;目的是为了需要时方便查看。 介绍 HTTP Digest Access Authentication Schema&#xff…...

MySql超大Sql文件导入效率优化

对于MySQL中超大SQL文件的导入&#xff0c;效率优化是至关重要的&#xff0c;因为不当的操作可能导致导入过程耗时过长&#xff0c;甚至失败。以下是一些建议来优化MySQL超大SQL文件的导入效率&#xff1a; 调整max_allowed_packet参数&#xff1a; 这个参数定义了MySQL服务器和…...

【leetcode1944--队列中可以看到的人数】

有n人排成一个队列&#xff0c;从左到右编号为0到n-1&#xff0c;height数组记录每个人的身高&#xff0c;返回一个数组&#xff0c;记录每个人能看到几个人。 类比&#xff1a;山峰问题&#xff0c;高的后面的矮的看不见。 从后往前&#xff0c;最后一个元素入栈&#xff0c…...

基于51单片机的室内空气质量检测-仿真设计

本设计是基于单片机的空气质量检测设计&#xff0c;主要实现以下功能&#xff1a; 可实现通过SGP30测量二氧化碳及甲醛浓度&#xff0c;当超过设置的最大值时&#xff0c;进行报警及通风和净化空气处理 可实现通过MQ-4测量甲烷浓度&#xff0c;当超过设置的最大值时&#xff0…...

day22二叉树part08 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

**235. 二叉搜索树的最近公共祖先 ** 这里利用上了二叉搜索树的特性&#xff0c;从上到下遍历&#xff0c;最近的公共祖先一定是满足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下的一款 多模式编辑器 &#xff0c;可以用来写代码&#xff0c;是 vi 的升级版。 此时无法输入&#xff0c;需要切换模式。 如上图&#xff0c;i 就是切换成…...

长方形边框 上方中间有缺口 css

<div class"text_6">大234234师掌4234柜</div><div class"text-wrapper_1"><span class"paragraph_1">四川慧创云戈科技有限公司推出的“大师掌柜”&#xff0c;是一个以餐饮外卖为切入口&#xff0c;专注实体小店新零售…...

2024-05-29 架构-程序设计-思考

摘要: 最近在抽出时间做一个数据库的driver, 其中有些问题驱动的软件代码的思考&#xff0c;是很值得回味的。 做的系统&#xff0c;所思考的问题&#xff0c;所设计的解决方案&#xff0c;其实都是可以看作是对解决问题方式。而不仅仅是某个类库的API的使用&#xff0c;某个…...

关于网络的基础知识

大家好&#xff0c;在当今数字时代&#xff0c;网络已经成为我们生活中不可或缺的一部分&#xff0c;它连接着世界的每一个角落&#xff0c;让信息、资源和人们彼此之间无阻碍地交流和共享。然而&#xff0c;对于许多人来说&#xff0c;网络仍然是一个神秘而复杂的领域&#xf…...

CTF网络安全大赛简单web题目:eval

题目来源于&#xff1a;bugku 题目难度&#xff1a;简单 一道简单web的题目 题目源代码&#xff1a; <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> 这个PHP脚本有几个关键部分&#xff0c;但…...

Linux通过 SSH 使用 rsync 进行文件传输

目录 目的整体思路ssh建立连接A服务器上的操作输入 ssh-keygen 生成密钥对查看公钥 B服务器上的操作设置公钥认证 A服务器上的操作使用SSH登录进行测试 同步数据知识拓展SSH&#xff08;Secure Shell&#xff09;rsync&#xff08;Remote Sync&#xff09; 目的 使用SSH&#…...

【保姆级介绍下Foxmail 邮箱】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

ABAP MD04增强排除MRP元素

场景 MD04跑出来很多MRP元素&#xff0c;用户想手工控制某些MRP元素不参与运算 分析 增强点还蛮好找的&#xff0c;控制MRP元素是否参与运算用下面的se19三代增强点就可以&#xff0c;打个断点看下MD04进的哪个增强点就行 旧版本的用这个&#xff1a;MD_CHANGE_MRP_DATA 新…...

构建一个简单的情感分析器:使用Python和spaCy

构建一个简单的情感分析器&#xff1a;使用Python和spaCy 引言 情感分析是自然语言处理&#xff08;NLP&#xff09;中的一项重要技术&#xff0c;它可以帮助企业和研究人员理解公众对特定主题或产品的看法。 在本篇文章中&#xff0c;我们将使用Python编程语言和 spaCy 库来构…...

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

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

数据结构算法题day05

数据结构算法题day05 题目算法思想代码运行代码 题目 从有序表中删除所有其值重复的元素&#xff0c;使表中所有元素的值均不同。算法思想 第一个元素&#xff08;不重复&#xff09;依次向后扫描&#xff0c;不重复就保留&#xff0c;重复&#xff08;不保留&#xff09;就删…...

关于《Java并发编程之线程池十八问》的补充内容

一、写在开头 在上一篇文章我们写《Java并发编程之线程池十八问》的时候,鉴于当时的篇幅已经过长,很多内容就没有扩展了,在这篇文章里对一些关键知识点进行对比补充。 二、Runnable vs Callable 在创建线程的时候,一般会选用 Runnable 和 Callable 两种方式。 【源码对…...

扒出秦L三个槽点,我不考虑买它了

文 | Auto芯球 作者 | 雷慢 比亚迪的有一个王炸“秦L”&#xff0c;再一次吸引了我注意力&#xff0c; 我上一辆车刚卖不久&#xff0c;最近打算买第二辆车&#xff0c; 二手车和新车都有在看&#xff0c; 我又是一个坚定的实用主义者&#xff0c; 特别是现在的经济环境不…...

【408真题】2009-28

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…...

LeetCode---链表

203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 代码示例1&#xff1a;(直接使用原来的链表来进行移除节点操作) //时间复杂度: O(n) //空间复杂度: O(1) class Solu…...

CMIP6数据降尺度实战:用Python从零构建区域气候模型(附完整代码)

CMIP6数据降尺度实战&#xff1a;用Python从零构建区域气候模型 当全球气候模型&#xff08;GCM&#xff09;的分辨率无法满足区域研究需求时&#xff0c;降尺度技术成为连接全球与局部气候信息的桥梁。本文将带您从CMIP6数据获取开始&#xff0c;逐步实现统计降尺度和动力降尺…...

uDebugLib:嵌入式零开销串口调试库设计与实践

1. uDebugLib 库概述uDebugLib 是一个轻量级、跨平台的嵌入式串口调试辅助库&#xff0c;专为 Arduino 及兼容平台&#xff08;如 ESP32、STM32&#xff08;通过Arduino Core&#xff09;、nRF52 等&#xff09;设计。其核心目标并非替代完整的日志系统&#xff08;如esp_log或…...

OpenClaw+GLM-4.7-Flash:自动化技术文档翻译系统

OpenClawGLM-4.7-Flash&#xff1a;自动化技术文档翻译系统 1. 为什么需要自动化翻译系统 作为一名经常需要阅读英文技术文档的开发者&#xff0c;我长期被两个问题困扰&#xff1a;一是专业术语翻译不统一&#xff0c;同一份文档里"pipeline"可能被翻译成"管…...

探秘含齿根裂纹的超高自由度斜齿 - 轴承复合故障特性

含齿根裂纹——轴承内圈&#xff0c;外圈&#xff0c;滚动体的超高自由度斜齿–轴承复合故障特性分析!才用残差法突出故障时域响应&#xff0c;采用包络谱对故障特征频率进行分析&#xff0c;模型难度巨大在机械系统的复杂世界里&#xff0c;含齿根裂纹以及轴承内圈、外圈、滚动…...

如何快速使用LivePortrait实现AI肖像动画:终极指南

如何快速使用LivePortrait实现AI肖像动画&#xff1a;终极指南 【免费下载链接】LivePortrait Bring portraits to life! 项目地址: https://gitcode.com/GitHub_Trending/li/LivePortrait LivePortrait 是一款革命性的AI肖像动画工具&#xff0c;能够将静态照片转化为栩…...

TurboDiffusion应用案例:让静态照片变动态视频的魔法

TurboDiffusion应用案例&#xff1a;让静态照片变动态视频的魔法 1. 从静态到动态的视觉革命 想象一下&#xff0c;你手机相册里那些珍贵的照片突然"活"了过来——海浪开始翻涌&#xff0c;树叶随风摇曳&#xff0c;人物的微笑变得更加生动。这就是TurboDiffusion带…...

10xGenomics单细胞测序选3‘还是5‘?一文讲清免疫组库与基因表达分析的黄金选择

10xGenomics单细胞测序&#xff1a;3与5端策略在免疫组库与基因表达分析中的科学抉择 当实验室的离心机停止运转&#xff0c;科研人员往往面临一个关键抉择&#xff1a;该选择3还是5端单细胞测序&#xff1f;这个看似技术性的选择&#xff0c;实则直接影响着后续免疫组库分析的…...

ms-swift框架实战:从零构建高效Embedding微调流水线

1. 为什么需要定制Embedding模型&#xff1f; 在智能客服问答匹配这类场景中&#xff0c;预训练的通用Embedding模型往往表现不佳。我去年做过一个电商客服项目&#xff0c;直接用开源Embedding模型处理"怎么退货"这类问题时&#xff0c;会把"如何退款"、&…...

OpenClaw+GLM-4.7-Flash:自动化学术研究助手搭建

OpenClawGLM-4.7-Flash&#xff1a;自动化学术研究助手搭建 1. 为什么需要学术研究助手&#xff1f; 作为一名经常需要查阅大量文献的研究者&#xff0c;我发现自己每天要重复处理三类机械性工作&#xff1a;在十几个学术平台反复切换关键词检索、手动整理PDF文件与笔记、从冗…...

OpCore-Simplify:如何用零代码工具在15分钟内完成黑苹果配置

OpCore-Simplify&#xff1a;如何用零代码工具在15分钟内完成黑苹果配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于想要在PC上安装macOS的用…...