关于海康摄像头的摘要认证

2023-05-16

最近在做一个项目时候要用到摄像头人脸抓拍,人脸识别等功能,原本使用海康的SDK就可以解决的,但是我们项目是在arm平台下开发的,而海康的SDK不支持arm平台,无奈联系的海康的技术支持,他们提供的了一种基于海康私有ISAPI 协议,通过HTTP进行摘要认证。

什么是摘要认证? 简单的说就是你要登录某个网站,网站会让你输入用户名密码才才能进行正常的操作,这首先浏览器会首先发出一个请求,然后服务器传回一个认证信息 ,该认证信息包含有认证域,随机密码,header等信息。当你输入正确的账户和密码,浏览器会自动根据你的账户和密码生成摘要认证信息,然后发送给服务器,服务器提取摘要信息,选择验证算法,对账户和密码进行验证,验证通过返回200  ok  ,然后就可正常的浏览网页了。类似于路由器的登录界面。具体的摘要认证流程学习,大家自行百度学习。

关于海康摘要认证方法的介绍参考官方文档如下:

1 摘要认证介绍 
ISAPI 协议基于 HTTP REST 架构,协议交互需要安全认证,Digest 摘要认证比 Basic 基础认证的安全级别
更高: 
1)通过传递用户名、密码等计算出来的摘要来解决明文方式在网络上发送密码的问题。 
2)通过服务产生随机数 nonce 的方式可以防止恶意用户捕获并重放认证的握手过程。 
1.1 认证握手过程 
1. 客户端发出一个没有认证证书的请求。 
GET /ISAPI/Security/userCheck HTTP/1.1 
Accept: text/html, application/xhtml+xml, */* 
Accept-Language: zh-CN 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko 
Accept-Encoding: gzip, deflate 
Host: 10.18.37.12 
Connection: Keep-Alive 
注:此处示例为用户名密码校验的ISAPI协议命令(GET方法),每次下发新的命令都需要重新认证。 

 

2. 服务器产生一个随机数nonce,并且将该随机数放在WWW-Authenticate响应头,与服务器支持的认
证算法列表,认证的域realm一起发送给客户端。 
HTTP/1.1 401 Unauthorized 
Date: Wed, 30 May 2018 19:16:52 GMT 
Server: App-webs/ 
Content-Length: 178 
Content-Type: text/html 
Connection: keep-alive 
Keep-Alive: timeout=10, max=99 
WWW-Authenticate: Digest qop="auth", realm="IP Camera(12345)", 
nonce="4e5749344e7a4d794e544936596a4933596a51784e44553d", stale="FALSE" 
注:401 Unauthorized表示认证失败、未授权。返回的WWW-Authenticate表示设备支持的认证方式,此
处设备只支持Digest摘要认证方式。 

 

HTTP/1.1 401 Unauthorized 
Date: Wed, 30 May 2018 19:23:32 GMT 
Server: App-webs/ 
Content-Length: 178 
Content-Type: text/html 


Connection: keep-alive 
Keep-Alive: timeout=10, max=99 
WWW-Authenticate: Digest qop="auth", realm="IP Camera(12345)", 
nonce="4f5455784e4452684f544136596a49344d54566a4f57553d", stale="FALSE" 
WWW-Authenticate: Basic realm="IP Camera(12345)" 
注:401 Unauthorized表示认证失败、未授权。返回的WWW-Authenticate表示设备支持的认证方式,此
处设备同时支持Digest摘要认证和Basic认证两种方式。stale表示nonce值是否过期,如果过期会生成新的随
机数。 

 

3. 客户端接收到401响应表示需要进行认证,选择一个算法(目前只支持MD5)生成一个消息摘要
(message digest,该摘要包含用户名、密码、给定的nonce值、HTTP方法以及所请求的URL),将摘要放到
Authorization的请求头中重新发送命令给服务器。如果客户端要对服务器也进行认证,可以同时发送客户端
随机数cnonce,客户端是否需要认证,通过报文里面的qop值进行判断,详见1.2章节介绍。 
GET /ISAPI/Security/userCheck HTTP/1.1 
Accept: text/html, application/xhtml+xml, */* 
Accept-Language: zh-CN 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko 
Accept-Encoding: gzip, deflate 
Host: 10.18.37.12 
Connection: Keep-Alive 
Authorization: Digest username="admin",realm="IP 
Camera(12345)",nonce="595463314d5755354d7a4936596a49344f475a6a5a44453d",uri="/ISAPI/Security/userCheck",cnonc
e="011e08f6c9d5b3e13acfa810ede73ecc",nc=00000001,response="82091ef5aaf9b54118b4887f8720ae06",qop="auth" 

 

4. 服务接收到摘要,选择算法以及掌握的数据,重新计算新的摘要跟客户端传输的摘要进行比较,验
证是否匹配,若客户端反过来用客户端随机数对服务器进行质询,就会创建客户端摘要,服务可以预先
将下一个随机数计算出来,提前传递给客户端,通过 Authentication-Info 发送下一个随机数。该步骤选
择实现。 
HTTP/1.1 200 OK 
Date: Wed, 30 May 2018 19:32:49 GMT 
Server: App-webs/ 
Content-Length: 132 
Connection: keep-alive 
Keep-Alive: timeout=10, max=98 
Content-Type: text/xml 

 

<?xml version="1.0" encoding="UTF-8"?> 
<userCheck> 
<statusValue>200</statusValue> 
<statusString>OK</statusString> 
</userCheck> 
注:响应200 OK表示认证成功。 

 

详细说明请参考RFC 2617规范文档。 


1.2 摘要计算过程 
在说明如何计算摘要之前,先说明参加摘要计算的信息块。信息块主要有两种: 
1. 表示与安全相关的数据的A1 
A1中的数据时密码和受保护信息的产物,它包括用户名、密码、保护域和随机数等内容,A1只涉及安
全信息,与底层报文自身无关。 
若算法是:MD5 
则 A1=<user>:<realm>:<password> 
若算法是:MD5-sess 
则 A1=MD5(<user>:<realm>:<password>):<nonce>:<cnonce> 

 

2. 表示与报文相关的数据的A2 
A2表示是与报文自身相关的信息,比如URL,请求反复和报文实体的主体部分,A2加入摘要计算主要目
的是有助于防止反复,资源或者报文被篡改。 
若 qop 未定义或者 auth: 
A2=<request-method>:<uri-directive-value> 
若 qop 为 auth:-int 
A2=<request-method>:<uri-directive-value>:MD5(<request-entity-body>) 
注:<uri-directive-value>为完整的协议命令 URI,比如“/ISAPI/Security/userCheck”。 

 

下面定义摘要的计算规则: 
若 qop 没有定义: 
摘要 response=MD5(MD5(A1):<nonce>:MD5(A2)) 

 

若 qop 为 auth: 
摘要 response=MD5(MD5(A1):<nonce>:<nc>:<cnonce>:<qop>:MD5(A2)) 
 
若 qop 为 auth-int: 
摘要 response= MD5(MD5(A1):<nonce>:<nc>:<cnonce>:<qop>:MD5(A2)) 
1.3 随机数的生成 
RFC2617建议采用这个假想的随机数公式: 
nonce = BASE64(time-stamp MD5(time-stamp ":" ETag ":" private-key)) 
其中: 
time-stamp是服务器产生的时间戳或者其他不会重复的序列号,ETag是与所请求实体有关的HTTP ETag
首部的值,priviate-key是只有服务器知道的数据。 

 

这样,服务器就可以收到客户端的认证首部之后重新计算散列部分,如果结果与那个首部的随机数不
符,或者是时间戳的值不够新,就可以拒绝请求,服务器可以通过这种方式来限制随机数的有效持续时间。 
 


包括了ETag可以防止对已经更新资源版本的重放请求。注意:在随机数中包含客户端IP,服务器好像就
可以限制原来获取此随机数的客户端重用这个随机数了,但这会破坏代理集群的工作,使用代理集群时候,
来自单个用户的多条请求通常会经过不同的代理进行传输,而且IP地址欺骗实现起来也不复杂。 

 

对于我司设备,认证的随机数超时时间如下所示: 
认证返回的 nonce 是 3s 超时; 
非认证返回的 none 是 30s 超时。 

主要流程如下

客户端是arm板  采用socket 编程,服务端是海康摄像头。 采用短连接方式。

1.客户端发送一个没有认证的请求

GET /ISAPI/Streaming/channels/101/picture HTTP/1.1
Host: 192.168.3.64
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

2.服务端发送返回如下

HTTP/1.1 401 Unauthorized
Date: Mon, 11 Mar 2019 10:22:35 GMT
Server: App-webs/
Content-Length: 178
Content-Type: text/html
Connection: close
WWW-Authenticate: Digest qop="auth", realm="DS-2CD2520F", nonce="4d6a553452444d30525441364e6d4d304e6a68684e47553d", stale="FALSE"
WWW-Authenticate: Basic realm="DS-2CD2520F"

<!DOCTYPE html>
<html><head><title>Document Error: Unauthorized</title></head>
<body><h2>Access Error: 401 -- Unauthorized</h2>
<p>Authentication Error</p>
</body>
</html>

3.客户端根据服务端返回的认证域 nonce 等信息,加入用户名和密码,生成response校验 ,重新发回给服务器  如下

GET /ISAPI/Streaming/channels/101/picture HTTP/1.1
Host: 192.168.3.64
Connection: keep-alive
Authorization: Digest username="admin", realm="DS-2CD2520F", nonce="4d6a553452444d30525441364e6d4d304e6a68684e47553d", uri="/ISAPI/Streaming/channels/101/picture", response="3993a815e5cdaf4470e9b4f9bd41cf4a", qop=auth, nc=00000001, cnonce="93d4d37df32e1a85"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

4.服务端验证通过返回200 ok

HTTP/1.1 200 OK
Content-Type: image/jpeg; charset="UTF-8"
Content-Length:153686

5.接着返回图片数据

这就是一次杭康摄像头摘要认证的过程,该源码就是抓取摄像头的一张图片。

程序源码请移步github :https://github.com/kyhkl/hivisoion_projcet.git

 

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

关于海康摄像头的摘要认证 的相关文章

  • strtok函数 的原理及一个坑

    我们知道strtok是一个字符串切割函数 xff0c 先来了解一下它 原型 xff1a char strtok char str const char delim 功能 xff1a 分解字符串为一组字符串 参数说明 xff1a str为要分
  • 机载处理器(树莓派、Jetson TX2及个人pc等均适用)配置ROS+mavros开发环境 (Pixhawk飞控测试)

    需要事先准备的 xff1a 树莓派 xff1a xff08 1 xff09 一块装了Ubuntu16 04 mate系统的树莓派 xff08 我的是3代 xff0c 别的平台没有测试过 xff09 xff0c xff08 2 xff09 键
  • 使用Autoware进行(双目)相机与激光雷达的联合标定

    使用Autoware进行 双目 相机与激光雷达的联合标定 VLP 16 与 ZED相机使用Autoware提供的 autoware camera lidar calibrator 工具进行标定 64 author Kehan Xue 64
  • svn status

    svn 是在提交前查看本地文本和版本库里面的文件的区别 返回值有许多种具体含义如下 xff1a url 61 L abc c svn已经在 svn目录锁定了abc c M bar c bar c的内容已经在本地修改过了 M baz c ba
  • rosserial通信协议简介

    1 概述 rosserial是一种ROS串行通信协议 xff0c 通过串行传输介质实现ROS的P2P通信 这种协议通过简单的添加包头和包尾可以实现了多主题或者服务共享串行通信介质 xff08 如串口 xff0c 网络socket xff09
  • ROS-----pluginlib使用总结

    1 简介 pluginlib是一个C 43 43 库 xff0c 可以实现为一个ROS包动态的加载和卸载插件 这里的插件通常是一些功能类 xff0c 且以运行时可动态加载的库 xff08 如共享对象 xff0c 动态链接库 xff09 的形
  • sumo生成随机车流

    在安装好sumo后 xff0c 生成模拟道路及模拟随机车辆 xff1a 主要参考链接 xff1a https blog csdn net qq 44045364 article details 102912041 以下对于该链接的内容进行一
  • 49天精通Java,第11天,java接口和抽象类的异同,default关键字

    目录 一 什么是接口 二 接口的特点 三 接口和类的区别 四 接口和抽象类的区别 五 接口的声明方式 六 default默认方法 大家好 我是哪吒 一 什么是接口 Java接口是一系列方法的声明 是一些方法特征的集合 一个接口只有方法的特征
  • 解决150%分辨率下拉框错位和echarts鼠标移入焦点错位的问题

    解决150 分辨率下拉框错位和echarts鼠标移入焦点错位的问题 当我们在前端开发的过程中 xff0c 可能会被要求适配主流分辨率 当我们把电脑分辨率调成150 的时候 xff0c 一些下拉框会发生错位现象 xff0c echarts图标
  • 互联网公司面试五大禁忌

    互联网这几年成为求职者追求的热门行业 xff0c 薪水也是水涨船高 xff0c 想要进入这个行业的人也是越来越多了 xff0c 本文给大家讲述一下互联网公司面试的五大禁忌 一 互联网公司HR最不想听到的离职原因 1 无意中泄漏公司机密而被辞
  • 真实面试经历:十面阿里,七面头条,六个Offer

    这是一篇很好的面试经验 xff0c 转载过来 xff0c 希望各位小伙伴可以借鉴 01 面试者背景简介 双非末流一本 xff0c 大三 xff0c CS xff08 计算机科学 xff09 专业 xff0c 有百度实习经历 02 面试情况
  • 程序员之歌:我是一个程序员

    工作一天 xff0c 来一起唱首歌缓解疲劳吧猿媛们
  • 如何准备校招技术面试+一只小菜鸟的面试之路

    校 招一路走来很幸运 xff0c 从最初的迷茫 xff0c 到偶尔的被否认 xff0c 然后慢慢调整心态 xff0c 有缺憾才能有进步 xff0c 正视的自己不足 xff0c 静下心努力提高 xff0c 勇敢尝试各种面试机会 xff0c 因
  • 获取对象属性值的两种方式

    获取对象属性值的方式有两种 xff1a 点 括号 span class token keyword let span obj span class token operator 61 span span class token punctu
  • 5 分钟,教你用 Docker 部署一个 Python 应用!

    在使用传统物理机或云服务器上部署项目都会存在一些痛点 比如 xff1a 项目部署速度慢 资源浪费 迁移难且扩展低 而使用 Docker 部署项目的优势包含 xff1a 高效利用系统资源 服务启动更快 环境一致 xff0c 迁移更加方便 本篇
  • nginx SSL证书

    SSL证书 什么是SSL证书 SSL xff08 Secure Sockets Layer xff09 证书是数字证书的一种 xff0c 类似于驾驶证 护照和营业执照的电子副本 因为配置在服务器上 xff0c 也称为SSL服务器证书 SSL
  • NX搭载Wecat载版SD卡

    写这篇文章原因是 xff1a 1是看官网的文档太长了 xff0c 二是确实想偷懒直接csdn登陆然后复制粘贴就好了 xff0c 三是文档确实很多坑 xff0c 四是实验室刷机电脑跑着个人实在是苔藓了 xff0c 别人盯着有不太好意思玩电脑
  • ROS学习第五天 ROS常用的组件库(一)——TF

    题外话 xff1a 首先给大家道个歉 xff0c 因为之前迷上了无人驾驶apollo仿真 xff0c 花了一段时间研究 后来发现没有资源 xff0c 没有设备 xff0c 是真的难学 xff0c 所以放弃了apollo 最近又到了开题答辩时
  • mysql数据库基础知识,mysql数据库简介(一看就懂,一学就会)

    目录 一 MySQL学习路线二 MySQL常见操作1 查看所有数据库show databases 2 MySQL 创建数据库3 删除数据库4 选择数据库use databasename5 查看该数据库下所有表show tables6 创建数
  • 账号和权限管理

    用户 xff1a 超级用户 xff1a uid gid为0 xff0c 超级用户是系统管理员 xff0c 具备系统最高权限 程序用户 xff1a 每个程序在创建时会自动创建一个程序用户 xff0c uid gid为1到999 xff0c 一

随机推荐

  • 科班程序员逆袭为渗透测试工程师的坎坷路(第一篇)

    渗透测试工程师 1 什么是渗透测试 渗透测试 xff08 penetration test xff09 事实上并没有一个标准的定义 xff0c 在国外的大部分安全组织达成的统一说法是 xff1a 渗透测试是通过模拟恶意黑客的攻击方法 xff
  • 《对抗攻击与防御分类方法综述》阅读笔记20220401

    对抗攻击与防御分类方法综述 A Review of Adversarial Attack and Defense for Classification Methods DOI 10 1080 00031305 2021 2006781 文章
  • Docker Desktop功能讲解

    2013 年发布至今 xff0c Docker 一直广受瞩目 xff0c 被认为可能会改变软件行业 概述 许多人并不清楚 Docker 到底是什么 xff0c 要解决什么问题 xff0c 好处又在哪里 xff1f 本文就来详细解释 xff0
  • rman备份报RMAN-00571、RMAN-00569、RMAN-03009

    rman备份时报错信息 xff1a RMAN 03009 failure of backup command on ORA DISK 1 channel at 07 03 2012 10 35 17 ORA 19809 limit exce
  • Scrapy-自动爬虫

    在前面几篇博文当中 xff0c 我们使用Scrapy框架编写的爬虫项目 xff0c 只能爬取起始网址中设置的网页 有时候 xff0c 我们需要让爬虫持续不断的自动爬取多个网页 xff0c 此时 xff0c 我们需要编写自动爬取网页的爬虫 在
  • Scrapy-连接数据库

    通过前面几篇文章的学习 xff0c 我们已经能够使用Scrapy框架写出一些常见的网络爬虫 在本章中 xff0c 我们将使用Scrapy框架 xff0c 将爬取到的数据存储到数据库中 与将数据写入文件一样 xff0c 写入到数据库中也是通过
  • Scrapy-请求和响应

    Scrapy使用Request和Response对象来爬行网站 通常 xff0c Request对象是在爬虫中生成的 xff0c 并在整个系统中传递 xff0c 直到它们到达下载器 xff0c 后者执行请求并返回一个Response对象 x
  • MySQL ERROR 1698 (28000) 错误

    之前MySQL服务端本机上使用密码登陆root账号是没有问题的 xff0c 但是今天不知道是因为动了哪里 xff0c 登陆失败并有这个错误代码 xff1a mysql u root p Enter password ERROR 1698 2
  • Gunicorn-配置详解

    在之前的文章中有记录WSGI容器的作用 xff0c 以及我们知道常见的容器就只有的uWSGI和Gunicorn xff0c 在之前的文章中有记录他们的特性及优缺点 xff0c 在这就不在多做描述 接下来将着重记录一下Gunicorn的一些配
  • YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

    目录 一 EfficientNet骨干网络1 EfficientNet架构2 EfficientNet在目标检测中的应用3 EfficientNet分辨率的缩放4 EfficientNet深度与宽度的缩放 二 YOLOv7结构1 YOLOv
  • Python-获取图片的大小

    了解过Pillow的都知道 xff0c Pillow是一个非常强大的图片处理器 xff0c 这篇文章主要记录一下Pillow对图片信息的获取 xff1a 安装Pillow pip span class hljs keyword instal
  • lsnrctl command not found

    在linux安装完oracle时 当你遇到lsnrctl command not found等问题都不能用时 会有几种情况 1 首先你先查看下环境变量里面有没有加入oracle的配置 执行 echo ORACLE HOME 没有的话 你执行
  • Ubuntu 18.04-安装图文教程

    Ubuntu xff08 友帮拓 优般图 乌班图 xff09 是一个以桌面应用为主的开源GNU Linux操作系统 xff0c Ubuntu 是基于Debian GNU Linux xff0c 支持x86 amd64 xff08 即x64
  • Docker-DockerFile的使用

    在使用DockerFile定制镜像之前 xff0c 我们先来了解一下镜像的构成 xff1a 镜像是容器的基础 xff0c 每次执行docker run命令的时候都会指定哪个镜像作为容器运行的基础 在之前的栗子中 xff0c 我们使用的镜像都
  • Python-标准库calendar的使用

    此模块允许你输出类似Unix cal程序的日历 xff0c 并提供与日历相关的其他有用功能 值得注意的是 xff0c 默认情况下 xff0c 这些日历将星期一作为一周的第一天 xff0c 将星期日作为一周的最后一天 欧洲惯例 不过 xff0
  • Docker MySql报2059错误: Authentication plugin 'caching_sha2_password' cannot be loaded

    最近在使用Docker安装和配置MySql xff0c 按照正常的步骤来安装和配置MySQL xff0c 可配置完成后登录MySQL客户端出现了2059错误 xff0c 于是上各种博客 技术论坛寻求相关的问题解决办法 xff0c 可是仍然找
  • 套接字与文件

    在Linux中 xff0c 所有套接字都是文件 xff0c 操作系统并不区分套接字和文件 xff0c 因此对二者可以使用相同的读写函数
  • MySQL中find_in_set函数的使用

    1 语法 FIND IN SET str strlist xff08 1 xff09 str 要查询的字符串 xff08 2 xff09 strlist 字段名 xff1b 参数以 分隔 如 1 2 6 8 查询字段 strlist 中包含
  • C文件创建并写入文件

    创建并写入文件 u003Cstdio h gt nint main n n t 创建一个名为data txt的文件 n tFILE pFile 61 fopen 34 data txt 34 34 w 34 n tif pFile 61 6
  • 关于海康摄像头的摘要认证

    最近在做一个项目时候要用到摄像头人脸抓拍 xff0c 人脸识别等功能 xff0c 原本使用海康的SDK就可以解决的 xff0c 但是我们项目是在arm平台下开发的 xff0c 而海康的SDK不支持arm平台 xff0c 无奈联系的海康的技术