HTTP Digest Access Authentication Schema

news2024/12/26 23:06:29

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.coloradmin.cn/o/1715341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring创建对象的多种方式

一、对象分类 简单对象&#xff1a;使用new Obj()方式创建的对象 复杂对象&#xff1a;无法使用new Obj()方式创建的对象。例如&#xff1a; 1. AOP创建代理对象。ProxyFactoryBean; 2. Mybatis中的SqlSessionFactoryBean; 3. Hibernate中的SessionFactoryBean。二、创建对象方…

MFC工控项目实例一主菜单制作

1、本项目用在WIN10下安装的vc6.0兼容版实现。创建项目名为SEAL_PRESSURE的MFC对话框。在项目res文件下添加相关256色ico格式图片。 2、项目名称&#xff1a;密封压力试验机 主菜单名称&#xff1a; 系统参数 SYS_DATA 系统测试 SYS_TEST 选择型号 TYP_CHOICE 开始试验 TES_STA…

内存函数<C语言>

前言 前面两篇文章介绍了字符串函数&#xff0c;不过它们都只能用来处理字符串&#xff0c;C语言中也内置了一些内存函数来对不同类型的数据进行处理&#xff0c;本文将介绍&#xff1a;memcpy()使用以及模拟实现&#xff0c;memmove()使用以及模拟实现&#xff0c;memset()使用…

越来越多的连锁企业选择开源连锁收银系统

连锁企业的收银系统作为其信息化的基础&#xff0c;随着运营的复杂化&#xff0c;越来越多的连锁企业选择开源连锁收银系统来满足其日常经营需要。商淘云为大家分享连锁企业选择开源连锁收银系统的三大原因&#xff0c;大家点赞收藏。 首先是灵活性和定制性强&#xff0c;连锁企…

k210数字识别 笔记2 (串口通信)

这个模型识别的还可以&#xff0c;离近点 识别率高达0.9 资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1D4ubJGMptqop1x_Nf8KqfQ?pwd1234 提取码&#xff1a;1234 一&#xff1a;报错解决 报错的意思应该是模型文件错误 原程序可以在sd卡运行&#xff0c;但…

stm32学习-CubeIDE使用技巧

1.hex文件生成 右键工程 2.仿真调试 3.常用快捷键 作用快捷键代码提示alt/代码注释/反注释ctrl/ 4.项目复制 复制项目&#xff0c;将ioc文件名改为项目名即可图形化编辑

刷爆leetcode第六期

题目一 用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除…

华为昇腾310 ATC模型转换工具安装

参考: https://bbs.huaweicloud.com/blogs/393282?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=other&utm_content=content https://www.hiascend.com/document/detail/zh/canncommercial/601/inferapplicationdev/atctool/atctool_0004.html 1、基本工具…

idm软件是做什么的 IDM是啥软件 idm软件怎么下载 idm软件怎么下载

一、IDM是啥软件 IDM 是由美国 Tonec 公司开发的 Windows 软件&#xff0c;该软件最初于 2005 年发布。IDM全称Internet Download Manager&#xff0c;是一款Windows平台老牌而功能强大的下载加速器&#xff0c;专注于互联网数据下载。这款软件是一款不错的轻量级下载工具&…

【EI会议】第二届计算机、物联网与智慧城市国际会议

第二届计算机、物联网与智慧城市国际会议 快速通道 投稿链接&#xff1a;loading 截稿时间&#xff1a;9月15日 检索&#xff1a;EI检索 一、会议信息 大会官网&#xff1a;www.ciotsc.org 会议地点&#xff1a;湖南株洲 会议时间&#xff1a;2023年11月15日-17日 二、征稿主…

Strust2 远程代码执行漏洞[s2-005]

漏洞复现环境搭建请参考 http://t.csdnimg.cn/rZ34p kali切换jdk版本请参考 Kali安装JAVA8和切换JDK版本的详细过程_kali安装jdk8-CSDN博客 漏洞原理 Strust2会将http的每个参数名解析成为OGNL语句执行&#xff0c;OGNL表达式通过#来访问Struts的对象&#xff0c;并且通过过…

光耦的工作原理

一、光电耦合器简介 光电耦合器主要是一种围绕光作为媒介的光电转换元器件&#xff0c;能够实现光到电、电到光之间的自由转换。我们又可以称之为光电隔离器&#xff0c;之所以这么称呼&#xff0c;主要是因为光电耦合器能够很好的对电路中的电信号起到隔离的作用。有效的保护…

C语言 指针——指针变量做函数参数

目录 指针变量的解引用 为什么要用指针变量做函数参数&#xff1f; 演示Call by value 指针变量的解引用 为什么要用指针变量做函数参数&#xff1f; 演示Call by value

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

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

【传知代码】BERT论文解读及情感分类实战-论文复现

文章目录 概述原理介绍BERT模型架构任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建 核心代码超参数设置训练结果注意事项 小结 本文…

软件测试新手要达到一个什么水平才能找到一份9K的工作?

我的读者里有很多 软测 新人&#xff0c;新人是指正在学 测试 的、以及工作时间不长的年轻人&#xff0c;他们经常问我一个问题&#xff1a; 自学到什么程度才能找到一份还不错的测试工作&#xff1f; 今天我就从我自己面试新人的角度来回答一下&#xff0c;我会把面试的知识点…

【Linux系统】--- Linux内核日志等级详解

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Linux系统】--- Linux内核日志等级详解…

MarkDown语法使用手册

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

一致性hash算法原理图和负载均衡原理-urlhash与least_conn案例

一. 一致性hash算法原理图 4台服务器计算hash值图解 减少一台服务3台服务器计算hash值图解 增加一台服务器5台服务器计算hash值图解 二. 负载均衡原理-urlhash与least_conn 2.1.urlhash案例 # urlhash upstream tomcats {hash $requ

景源畅信电商:抖音开店步骤是什么?

随着社交媒体的兴起&#xff0c;抖音已经成为一个不可忽视的电商平台。许多人都希望通过抖音开店来实现自己的创业梦想。那么&#xff0c;抖音开店的具体步骤是什么呢?接下来&#xff0c;我们将详细阐述这一问题。 一、明确回答问题抖音开店的步骤主要包括&#xff1a;注册账号…