http协议之digest(摘要)认证

2023-05-16

参考网址:

RFC 2617 - HTTP Authentication: Basic and Digest Access Authenti (RFC2617)

RFC 1321 - The MD5 Message-Digest Algorithm (RFC1321)

sip digest认证 - bw_0927 - 博客园

http://blog.sina.com.cn/s/blog_53b15ed5010006t9.html

SIP注册认证及Response值计算-chicol-ChinaUnix博客

HttpWebRequest 使用NetworkCredential 进行域认证下载时不成功 的解决方案_JackxinXu2100的博客-CSDN博客_networkcredential

404错误

Access denied when you call Web Service - Internet Information Services | Microsoft Learn

其中前面的5个是重要的,而前面2个是最重要的

网上下载了一个thttpd的web服务器做为嵌入式的web服务,在完成了所有的功能之后,提出基于web服务httpd协议的所有功能都要进行保护,即进行认证。然后从网上开始找相关的资料,经过几天的时间,终于弄好了。

在此不讨论basic认证,因为basic认证过于简单,直接传送的明文。

我不理解这个digest单词的含义,也不理解rfc2617文档中digest-challenge的含义,现在还没有转过来呢。

首先说明,以下的过程,只是基于我的内容方面的描述,可能不够全面,所以本文只做为普通参考。

认证的过程总体上是:客户端请求资源->服务器返回认证标示->客户端发送认证信息->服务器查验认证,如果成功则继续资源传送,否则直接断开连接。

服务器返回认证标示的必要内容如下:

WWW-Authenticate: Digest realm="xx",qop="auth,auth-int",nonce="xx",opaque="xx"

这个部分需要和http的协议头部分一起,即放在第一个空行的前面,其中的双引号也一同传输。在rfc2616文档中还定义了很多的其它域,各域之间都用“,”号隔开,这里用不到,不进行讨论。各域的值中,不允许出现冒号“:”,因为冒号在md5加密时是个连接符。另外所有的值都必需是可见字符,这和http协议的要求相一致。这个部分的内容很严格,如果弄不好,则客户端可能会提示错误,比如“协议冲突”、“拒绝服务”等情形

同时返回401的Unauthorized错误。

默认是md5加密,而且md5应该是用的最广的,所以对于algorithm域,无需添加。

WWW-Authenticate是httpd的一个标头

realm的值是一个简单的字符串,而rfc2617上写的是一个email类型的字符串,我看这个没有必要意义,所以我就也简单地写了个email形式的字符串

qop是认证的(校验)方式,这个比较重要,对后面md5的加密过程有影响,值就按照上面的那样写就行了

nonce的值也是一个字符串,如果不严格,可以随机生成一个就行,注意它是个GUID,即唯一的、不重复的。如果严格,则需要包含时间信息、客户端IP信息和其它信息,因为认证过程的时间很短,所以如果服务器收到认证信息后发现这个时间和服务器的时间相去甚远,那说明不正常,直接拒绝,以防止攻击,还有客户端IP,如果这个IP一直这样攻击,则可以在一定时间内发现是该IP的连接则直接断掉。这些严格的做法主要是为了防止攻击。在rfc2617上有狭路为详细的描述。我这里没有考虑这些,只是使用了个简单的字符串

opaque是个字符串,它只是透传而已,即客户端还会原样返回过来。实际上,上面的那些域,客户端都还是会原样返回的,但返回时除了以上的那些域之外,还会增加新的内容进来。

客户端在收到401错误之后,根据上面的那些信息,需要用户输入用户名和密码,然后返回给服务器如下内容:

Authorization: Digest username="xx",realm="xx",qop="auth",nonce="xx",uri="path",cnonce="xx",nc=00000001,response="xx",opaque="xx"

除了qop的值不一样之外,其它存在的那些域的值都是一样的,新增加的部分:

username是要认证的用户名

uri是本次请求的资源位置,比如“/public/userinfo.htm

cnonce是客户端产生的一个GUID,一般是32字节,而且是16个字节字符串的16进制形式表示,所以其中的内容是0~9和a~f之间的那些字符。其实nonce也是一样,但我没有特意这样做,比如我直接生成一个数字,然后以16进制输出,而没有特殊追求16个字节。

nc是认证的次数,因为如果认证失败,则仍然可以重新发送认证信息继续认证,第一次是1,第二次是2,第三次是3,...。但我这里没有这样弄,只允许一次,如果认证不过就关闭了连接,所以我只处理了1的情况,即00000001,这个值总是固定的8个字节,而且不加引号,和其它域的格式不一样,导致我在分析这个域的时候单独写了个代码,晕,不知道为什么会定义的不一样。

response的值就很重要了,是根据以上信息,再加上密码通过一定的顺序计算出的一个md5码,固定为16字节的16进制表示形式。服务器在收到所有这些信息后,也通过相同的方式计算出这个值,而密码则是保存在服务器端,即服务器要通过用户名去找到对应的密码,然后和计算出md5值,再和客户端传过来的response值对比,如果一样,则认证通过,否则通不过。

关键的是md5值的计算,用各域的值进行计算(不带两端的双引号)。

总的计算公式是:md5=HA1:HD:HA2

注意,这个公式被我简化了,只是为了便于描述而和其它文档上的形式不一样。表示的是对HA1:HD:HA2进行md5计算,下同。

md5表示最终计算出来的值,即response的值

注意之间的冒号“:”也是计算的字符串中的内容,是个连接符

如果algorithm的值是“md5-sess”,则

HA1=username:realm:password:nonce:cnonce              (1)

否则

HA1=username:realm:password                                     (2)

我这里用的是(2)

如果qop有值(if (*pszQop)),则

HD=nonce:noncecount:cnonce:qop                                (3)

否则

HD=nonce                                                                       (4)

由于我这里qop有值,所以用了(3)

HA2=method:uri

如果qop的值是“auth-int”,则HA2的值计算不一样,我看的不是很懂,而且我没有用,所以这个我没有管它。

method是指“GET”/"POST",即http头中指定的获取资源的方式

需要注意的是,在计算过程中,需要分配足够的内在,否则越界可能导致字符串内容的变化,我的就因为这个问题搞了1天的时间才找到,最后从网上找了个md5加密的计算工具,把各部分的计算结果进行对照才发现了问题。

实际上还找了另外的一个网址,公式写的比较好,比较清楚,但后来没有收藏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

http协议之digest(摘要)认证 的相关文章

随机推荐

  • windows系统官网下载

    windows系统官网下载 说明步骤 说明 主要记录如何在微软官方网站下载windows系统 xff0c 本文主要讲解下载 iso的方式 步骤 1 进入微软官方网站 https www microsoft com zh cn softwar
  • Everything官网下载

    基于名称快速定位文件和文件夹Everything官方下载 简单说明地址 简单说明 Everything是voidtools开发的一款文件搜索工具 xff0c 官网描述为 基于名称实时定位文件和目录 xff08 Locate files an
  • Android SDK Installed Packages

    1 1 解压Android SKD 1 2 执行如上目录下的文件 xff1a SDK Setup exe xff0c xff08 机器人图标的哪个 xff09 注意 xff1a 一般的话会出现 Failed to fetch URL htt
  • linux下启动tomcat报错APR/native library which is not available的解决方案

    在linux上使用tomcat8配置支持http2 0的时候 xff0c server xml的配置文件里面有这么一段配置 xff1a lt Connector port 61 34 45501 34 protocol 61 34 org
  • 美国出台最严技术出口管制!14项前沿科技面临封锁

    关注ITValue xff0c 查看企业级市场最新鲜 最具价值的报道 xff01 xff08 本文转载自量子位公众号 xff0c ID xff1a QbitAI xff0c 作者 xff1a 乾明 夏乙 问耕 xff09 美国又打出一套七伤
  • Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-135-generic x86_64) 裸机配置静态IP

    1 xff0c os装好后默认有以下文件 xff1a etc netplan 00 installer config yaml 2 xff0c 配置该文件 xff1a sudo vi etc netplan 00 installer con
  • linux nvidia-smi 执行速度很慢问题解决

    老办法 sudo nvidia smi pm 1 比较科学的方法 sudo nvidia persistenced persistence mode 一般四卡会出现上面问题 xff0c 双路主板差多个显卡的时候容易出现
  • 【机器学习】信用卡欺诈检测 (下采样、SMOTE过采样、集成学习、Pytorch)

    2022 4 17 补充 视频 xff1a 参考 xff1a 6 01 信用卡交易欺诈数据检测 哔哩哔哩 bilibili 参考 xff1a 机器学习 Kaggle 信用卡欺诈检测 Tommy 数据不平衡 ipynb myaijarvis
  • ubuntu下makeinfo/texinfo 安装的解决办法

    环境 ubuntu 16 04 sudo apt get install makeinfo 提示找不到包 搜了一圈资料 xff0c 发现makeinfo其实就是texinfo sudo apt get install texinfo 还是找
  • 自平衡机器人DIY(一)

    看到一篇DIY自平衡机器人的文章 xff0c 感觉特别有意思 xff01 正好趁着寒假的工夫 xff0c 也来做一做 参考过程 xff1a 自平衡机器人 蛋黄物语 原理 原理 就是应用负反馈控制 xff0c 由测量到的角度和自身平衡时的自然
  • Go 与 Java 生成grpc代码

    1 背景 xff1a 由于公司的日志系统使用的是plumelog xff0c 最近生产环境老是报 jedis连接池不够 xff0c 导致丢失日志 xff0c 而且服务老是重启 xff0c 怀疑跟日志系统有关 xff0c 于是自己改造plum
  • Ubuntu开机自动挂载Windows分区(NTFS FAT32)教程

    这是我总结网上相关教程 xff0c 结合我的实际操作总结的 在开始实际的操作之前 xff0c 我们必须要了解linux系统下的挂载概念 在linux操作系统中 xff0c 挂载是一个非常重要的功能 xff0c 使用非常频繁 它指将一个设备
  • 第六章 Java FutureTask 示例

    在本教程中 xff0c 我们将看到有关 Java FutureTask 的示例 FutureTask 类已在 JDK 5 中与 Executor Framework 一起引入 FutureTask类是Future对象的具体实现 xff0c
  • ORB-SLAM2系统的实时点云地图构建

    ORB SLAM2系统的实时点云地图构建 这篇博客点云地图构建的流程代码介绍点云地图构建类对象小调整获取关键帧点云地图构建与叠加在地图中设置当前相机位置点云地图到Octomap的转换 地图效果结尾 这篇博客 xff08 PS 修改于2020
  • 查理·芒格:让自己配得上想要的东西

    巴菲特说他一生遇人无数 xff0c 从来没有遇到过像查理这样的人 94岁的查理 芒格毕业于哈佛大学法学院 xff0c 是沃伦 巴菲特的黄金搭档 xff0c 伯克夏 哈撒韦公司的副主席 xff0c 芒格的头脑是原创性的 xff0c 从来不受任
  • react路由传参的几种方式

    params传参 支持多个动态参数 state 61 id 88 name Jack 路由页面 xff1a 路由跳转并传递参数 xff1a 链接方式 xff1a lt Link to 61 pathname code demo this s
  • 对极几何、三角测量、PnP、ICP问题描述

    对极几何 三角测量 PnP ICP问题描述 文章目录 对极几何 三角测量 PnP ICP问题描述前言2D 2D xff1a 对极几何三角测量1 求解空间点深度2 求解空间点坐标 3D 2D xff1a PnP1 直接线性变换 xff08 D
  • springsecurity 登录后依然无法访问页面

    springsecurity 登录后依然无法访问页面 登录成功 点击左侧功能列表报错 org springframework security access AccessDeniedException Access is denied at
  • 前端---vscode插件推荐及GIT一些问题操作说明(持续更新)

    以前都是用sublime xff0c 最近开始使用vscode xff08 v1 50 0 xff09 xff0c 写一些心得记录一下 先安利一些自己使用的插件 TabNine这个插件 xff0c 如果电脑配置ok xff0c 可以装一下
  • http协议之digest(摘要)认证

    参考网址 xff1a RFC 2617 HTTP Authentication Basic and Digest Access Authenti RFC2617 RFC 1321 The MD5 Message Digest Algorit