有关HTTP 401验证的那些事儿

2023-05-16

        前段时间突然遇到有一个需求:要求能够抓取到NVR上连接的摄像头设备列表。

        因为要的比较急,而且我还没啃透海康SDK的文档,所以只好考虑另辟蹊径,用一些别的方法来达到目标咯。

        我们登录到NVR的web控制页面不难发现,左侧可不就是我想要的设备列表吗!?

那么,问题来了,我要怎么搞到这一块的数据呢?

        打开F12开发者工具,我们可以观察到浏览器发送了哪些请求,并接收到了哪些服务器响应的数据,经过筛查,我发现了有一个浏览器发起的请求,请求到的结果似乎就是我想要的东西。

        我们把这个请求的URL复制出来,单独观察看看:

http://192.168.0.109/ISAPI/ContentMgmt/InputProxy/channels?security=1&iv=decb6a649cd7e051546206bdd6159c98

        通过观察这个URL地址,可以发现这里请求的NVR的ip是:192.168.0.109,NVR开放的端口是:80,

请求的资源是:/ISAPI/ContentMgmt/InputProxy/channels

请求时还带了几个参数:security和iv。至于这两个参数是啥意思,我还不知道。

        但是本着“删繁就简”的原则,我可以去测试一下这些参数。

        首先把URL粘贴进浏览器中,我们手动发起访问,看看是个什么结果:

访问结果是网页弹出了一个简易的认证页面,要求你输入账号和密码才能登录。

        在我们输入了正确的账号和密码之后,这个地址显示出了一份包含了所有设备的xml:

当我输入错误的账号密码或者点击“取消”时,则会返回一份提示401错误的xml:

 

 

        经过几轮测试,我发现前面说到的请求带的两个参数:security和iv,即使删掉也能够正常地获取到xml。那么我需要请求的URL地址就简化成了:

http://192.168.0.109/ISAPI/ContentMgmt/InputProxy/channels

        到目前为止,我遇到的问题就简化成了:如何抓取到上面这个URL下的xml,并且解析出设备列表。解决这个问题的小目标也明确了:

1、模拟登陆这个网页,然后获取到xml;

2、解析xml,拿到所需要的设备信息。

 

        首先咱先可以完成第一个小目标,模拟登陆这个网页。

        电视机前有心的小朋友肯定注意到了,上面截图中,弹出的这个认证页面和一般账号密码form是很不一样的,它比较简陋,而且是浏览器主动弹出来的,不是显示在页面上的。这其中究竟发生了什么呢?

        我们可以抓个包来看看。(因为chrome的开发者工具抓到的包比较简陋,分析不出啥有用的信息,所以我就用Fiddler抓包了。)

        再使用浏览器完成了一次请求之后,我们轻而易举地在Fiddler里面发现抓到了两个包:

        第一个响应码为401的数据包里面的报文信息是这样的:

        上图中蓝色的部分为服务器返回的,提示需要认证的信息(因为http 401代码表示你未授权,因此需要验证你的身份信息),这里我们可以发现服务器提供了两种认证算法方式:基本(Basic)认证和摘要(Digest)认证。

        然后再看我们在输入正确的账号和密码之后,浏览器发出的数据包(就是下面那个状态码是200的):

不难发现,数据包中包含了一项很特别的参数:Authorization。浏览器发送的这个数据完整的是这样的:

Digest username="admin", realm="DVRNVRDVS", nonce="b0a97d26d1216728a76f9cc23fdc1917:1547564458637", uri="/ISAPI/ContentMgmt/InputProxy/channels", algorithm=MD5, response="45924b8342669b4493532a8352b628d0", qop=auth, nc=00000001, cnonce="2095e2d3b12ae7ce"

        这里需要先补充一下HTTP 401认证的一些基本知识,特别是其中摘要(Digest)算法的知识:认证模式之Digest模式 

以及 digest 用户认证 response生成算法

        这些都了解了之后。那么剩下的问题也就不难了:我们按照标准的digest算法,计算出正确的数据,并且把它发送给服务器,那不就认证通过啦?

        这里我用Java写了一个能计算出正确Response值且能完成自动登录并拿到xml的demo。代码这里不多赘述,这里仅说明一下关键的步骤和原理:

严格按照Digest算法的计算步骤算各项MD5值,且每一项都要取小写字符(大写字符算出来的MD5值不一样),那么最后算出来的Response值便是正确的MD5值。

        然后我们重写toString()方法,把计算出来的结果,格式化为标准的Digest header格式:

        最后我们将计算出来的结果放在http请求的header中,发送给服务器,应该就能验证通过了。

        测试一下,能拿到数据。

     

        至于最后的解析我用的是dom4j。这个不复杂,在这里就不多赘述了。

 

        最后附上这个小demo:模拟Digest认证的登录demo

 

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

有关HTTP 401验证的那些事儿 的相关文章

随机推荐

  • STL常用容器——stack容器的使用

    文章目录 STL常用容器 stack容器的使用1 stack容器介绍2 stack容器常用接口 STL常用容器 stack容器的使用 1 stack容器介绍 stack容器简介 stack容器是堆栈容器 xff0c 该容器具有先进后出的特性
  • STL常用容器——queue容器的使用

    文章目录 STL常用容器 queue容器的使用1 queue容器的介绍2 queue容器常用接口2 1 queue容器构造函数2 2 queue队列容器常用的成员函数 STL常用容器 queue容器的使用 1 queue容器的介绍 queu
  • STL常用容器—— list 容器的使用

    文章目录 STL常用容器 list 容器的使用1 list 容器介绍2 list容器的构造函数3 list容器的赋值和交换4 list容器大小操作5 list容器添加和删除元素操作6 list容器数据存取7 list容器反转和排序 STL常
  • STL常用容器——set容器的使用

    文章目录 STL常用容器 set容器的使用1 set容器简介2 set容器的构造和赋值3 set容器的大小和交换4 set容器的添加与删除5 set容器的查找与统计6 pair类模板7 set和multiset的区别8 set容器的排序 S
  • STL常用容器——map容器的使用

    文章目录 STL常用容器 map容器的使用1 map容器介绍2 map容器构造和赋值3 map容器大小和交换4 map容器的添加和删除4 1 insert插入数据的四种方式4 2 删除键值对 5 map容器查找和统计6 map容器排序 ST
  • STL常用算法——遍历算法

    文章目录 STL常用算法 遍历算法1 for each 2 transform STL常用算法 遍历算法 1 for each for each xff1a 遍历容器 xff0c 对容器中的每一个元素调用函数或函数对象 函数原型 xff1a
  • STL常用算法——查找算法

    文章目录 STL常用算法 查找算法1 find 2 find if 3 adjacent find 4 binary search 5 count 和count if 5 1 count 5 2 count if STL常用算法 查找算法
  • 视觉识别示例-海康威视

    视觉识别示例 海康威视 C Program Files x86 MVS Development Documentations1 在海康威视软件MVS xff0c 默认安装目录下有示例及说明 xff0c 如上图是示例说明 C Program
  • STL常用算法——排序算法

    文章目录 STL常用算法 排序算法1 sort 2 random shuffle 3 merge 4 reverse STL常用算法 排序算法 1 sort sort xff1a 对容器或普通数组中范围内的元素进行排序 xff0c 默认进行
  • STL常用算法——拷贝和替换算法

    文章目录 STL常用算法 拷贝和替换算法1 copy 2 replace 3 replace if 4 swap STL常用算法 拷贝和替换算法 1 copy copy 函数 xff1a 将源容器内指定范围的元素拷贝到目的容器中 函数原型
  • STL常用算法——算术生成算法和集合算法

    文章目录 STL常用算法 算术生成算法和集合算法1 算术生成算法1 1 accumulate 1 2 fill 和fill n 2 集合算法2 1 set intersection 2 2 set union 2 3 set differe
  • CompletableFuture的使用

    文章目录 1 Future2 CompletableFuture 并行 xff0c 并发 并发 xff1a 一个实体上 xff0c 多个任务有序执行 并行 xff1a 多个实体上 xff0c 多个任务同时执行 用户线程 用户线程是系统的工作
  • 将本地jar添加到Maven仓库

    一 将jar添加到本地仓库的做法 xff1a 以下面pom xml依赖的jar包为例 xff1a 实际项目中pom xml依赖写法 xff1a html view plain copy lt dependency gt lt groupId
  • nodejs如何实现Digest摘要认证?

    文章目录 1 前言2 原理3 过程4 node实现摘要认证5 前端如何Digest摘要登录认证 xff08 下面是海康的设备代码 xff09 1 前言 根据项目需求 xff0c 海康设备ISAPI协议需要摘要认证 xff0c 那么什么是摘要
  • HAL库中断方式进行串口通信

    目录 一 通过CubeMX配置项目 二 在keil配置代码 三 烧录运行 四 输出 五 总结 六 参考链接 一 通过CubeMX配置项目 二 在keil配置代码 main函数中的while循环里面添加传输代码 if flag 61 61 1
  • 串口UART

    目录 串口概念 串口rs232 数据格式 注意事项 总体结构图 代码verilog 接收模块 结构图 波形图 编辑 代码 verilog 发送模块 结构图 波形图 代码 verilog 串口rs485 串口概念 串口是异步 串行通信接口 x
  • vs code 无法打开任何文件/新建文件报错this.configurationService.getValue(…) || []).filter is not a function

    vs code 无法打开任何文件 新建文件报错this configurationService getValue filter is not a function 主要起因是在一台mac 电脑上登录了vs code的同步帐号 xff0c
  • ESP32环境搭建遇到的问题记录

    关于安信可AiThinkerIDE V1 0自带的esp idf xff08 v3 3 咨询淘宝上的技术 xff09 xff0c 是可以在该IDE上导入运行的 xff1b 但是我使用了最新的esp idf v4 2 xff0c 在IDE上却
  • SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

    一 xff1a 使用场景 xff1a 假如你的项目 xff08 这里指的是手机客户端项目 xff09 的某个版本 xff08 例如1 0版本 xff09 已经完成开发 测试并已经上线了 xff0c 接下来接到新的需求 xff0c 新需求的开
  • 有关HTTP 401验证的那些事儿

    前段时间突然遇到有一个需求 xff1a 要求能够抓取到NVR上连接的摄像头设备列表 因为要的比较急 xff0c 而且我还没啃透海康SDK的文档 xff0c 所以只好考虑另辟蹊径 xff0c 用一些别的方法来达到目标咯 我们登录到NVR的we