onvif应用--IPC鉴权(认证)

news2024/11/15 13:35:43

一、鉴权原理

1)onvif的用户验证,是基于WS_UsernameToken,所谓的WS_UsernameToken加密,就是将用户名、密码、Nonce、Created都包含在了header里面

参数

意义

username待认证的用户名
Nonce客户端随机产生的字符串
Created请求认证的UTC时间(格式: 2023-11-29T08:05:52Z)
PasswordDigest需要Password(明文密码)、Nonce、Created经过公式生成

2)鉴权信息包括用户名、密码,在HTTP传输过程中不能是明文,有一定的加密算法

Digest鉴权是一种比基本鉴权更安全的身份验证方式,它避免了密码在网络中的明文传输

在ONVIF中,客户端使用用户名和密码的哈希值进行鉴权,服务器通过验证这个哈希值来确认身份

Digest的获取需要移植Base64编解码库、SHA1库,移植完成通过下面公式得到:

  • PasswordDigest= B64Encode( SHA1(B64DECODE(Nonce) + Created + Password(明文密码))

Nonce是一个随机数,主要用于防止重放攻击,但是它是经过Base64编码后作为字符串传输的,加密过程中,需要将Nonce解码为二进制数据,然后与Created和Password进行拼接

因此,需要先使用B64DECODE对Nonce进行解码,将其转换为二进制数据

3)有很多onvif接口在调用之前需要鉴权(即调用soap_wsse_add_UsernameTokenDigest函数),并且鉴权完一次之后还需要重新鉴权

成功认证后,可以通过调用ONVIF提供的各种服务接口,如获取设备信息、设置配置、控制摄像头等

只有以下接口是可以在不认证的情况下调用

  • GetWsdlUrl
  • GetServices
  • GetServiceCapabilities
  • GetCapabilities
  • GetHostname
  • GetSystemDateAndTime
  • GetEndpointReference
  • GetRelayOutputOptions

二、如何认证

可利用gSOAP源码中的soap_wsse_add_UsernameTokenDigest函数,可以轻松实现鉴权

1)在soapcpp2 生成ONVIF代码框架之前,要在onvif.h头文件开头加入:

#import “wsse.h”

2)依赖

包含以下文件:

  • wsseapi.c
  • wsseapi.h
  • mecevp.c
  • mecevp.h
  • smdevp.c
  • smdevp.h
  • threads.c
  • threads.h
  • dom.c

这些文件在gsoap目录和gsoap/plugin目录下,将这些文件拷贝到项目中,以便参与编译

3)makefile中必须添加编译开关-DWITH_DOM -DWITH_OPENSSL

4)安装OpenSSL

wsse系列函数依赖OpenSSL库,得去OpenSSL官网下载源代码来编译、安装,里面有我们需要的库文件和头文件,如libssl.so、libcrypto.so

5)实现认证

ONVIF_SetAuthInfo函数是对soap_wsse_add_UsernameTokenDigest的二次封装

ONVIF_GetDeviceInformation函数内部增加了设置鉴权信息,在调用soap_call___tds__GetDeviceInformation之前,先调用ONVIF_SetAuthInfo函数设置鉴权信息

/* 对指定的IPC使用鉴权命令查询媒体信息 */

    struct soap *soap;  //soap环境变量         

    soap = soap_new(); //为soap申请变量空间,并初始化

    if(soap==NULL)

    {

        printf("%s : %d, can't create new soap! \n",__FUNCTION__, __LINE__);

        return -1;

    }  

    soap_set_namespaces(soap, namespaces); //设置soap的namespaces  

    /* ---- 开始获取媒体信息------ */ 

    soap_wsse_add_UsernameTokenDigest(soap, "user", username, password);

    bret = MyGetProfiles(soap, index);

    if(bret==FALSE)

    {

        printf("--ERROR: MyGetProfiles() return false!  \n");

        return FALSE;

    }

注意:但凡是ONVIF规定要鉴权的接口,每次调用之前,都要重新设置一次鉴权信息(即调用ONVIF_SetAuthInfo函数),因为IPC的应答信息会重置soap对象,导致鉴权信息丢失,所示每次都要重新设置鉴权信息

三、ONVIF Device Test Tool

1)先使用ONVIF Device Test Tool熟悉鉴权流程

搜索到设备之后需要输入设备用户名User Name及密码Password,后Check

若认证成功Scopes框弹出设备信息,Check这一步不一定要走,只是为了验证用户名或密码是否错误,但是User Name及密码Password若要进行鉴权需要填写,ONVIF Device Test Tool后续的操作会依赖这些输,入用户名及密码后,进入Debug界面

2)进入Debug界面后Authentication栏选择WS-Username token认证,继续点击Media栏,获取Media URL,ONVIF Device Test Tool需要先进行Media URL才能继续获取Media Profile。

需要优先获取到Media URL媒体服务地址,才能进行下一步,不正确的Media URL会导致获取Media Profile失败,获取Media Profile需要进行WS-Username token鉴权认证。

请求发送后右边边框会弹出响应消息,认证成功后Media Profile框下就会有TestMediaProfile(),当中可以选择Profile_x(不同Profile token对应不同码流),Profile_x主要作用在之后RTSP流获取

四、相关函数

soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id,    const char *username, const char *password) 

soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id,  const char *username, const char *password) ;

soap_wsse_add_Security(struct soap *soap) ;

calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]);

calc_nonce(struct soap *soap, char nonce[SOAP_WSSE_NONCELEN])

SHA1PadMessage(SHA1Context *context)

SHA1ProcessMessageBlock(SHA1Context *context)

SHA1Reset(SHA1Context *context)

SHA1Input(SHA1Context  *context,const  char *message_array, unsigned  length)

SHA1Reset(SHA1Context *context)

  • soap_wsse_add_UsernameTokenText() 函数通过在SOAP请求中添加WS-Security的用户名令牌(Username Token)和密码来实现认证

涉及到内存分配、数据初始化和设置密码的过程,确保 UsernameToken 和 Password 被正确配置,以便用于认证

  • soap_wsse_add_UsernameTokenDigest_at() 函数为SOAP消息添加了包含Digest认证的用户名令牌

包括生成和编码 nonce、计算Digest、设置用户名令牌的各个字段,涉及生成安全认证所需的各种参数,并将它们正确地插入到SOAP请求中

  • soap_wsse_add_UsernameTokenDigest() 函数简化了 soap_wsse_add_UsernameTokenDigest_at() 的调用,默认使用当前时间生成用户名令牌的Digest认证

这使得调用者无需手动传入时间戳,简化了函数的使用

SOAP_FMAC1

int

SOAP_FMAC2

soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password)

{

  return soap_wsse_add_UsernameTokenDigest_at(soap, id, username, password, time(NULL));

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107040.html

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

相关文章

arXiv风评被害?

arXiv “风评被害”? arXiv是一个在学术界具有重要影响力的开放预印本论文网站,自三十多年前创立以来,它已经成为了物理学、计算机科学、统计学等科学论文最重要的发布平台之一,同时也是众多科研人员分享和交流研究成果的重要渠道…

单片机工程师:创新与挑战之路

摘要:本文全面深入地探讨了单片机工程师这一职业角色。详细阐述了单片机工程师的职责范围、所需技能,包括硬件设计、软件编程、调试与测试等方面。分析了单片机在不同领域的应用,如工业控制、消费电子、智能家居等。同时,探讨了单…

【计算机组成原理】计算机系统的基本组成

文章目录 计算机硬件的基本组成早期的冯诺依曼机冯诺依曼结构冯诺依曼机的特点 现代计算机现代计算机的结构 各硬件的工作原理主存储器主存储器的基本组成 运算器运算器的基本组成 控制器控制器的基本组成 计算机软件 计算机硬件的基本组成 早期的冯诺依曼机 冯诺依曼在研究 …

图纸文件怎么加密?2024六款图纸加密软件推荐,个个好用不踩雷!

想象一下,公司的设计图纸被无意间泄露,结果对手提前推出了相似的产品。为了避免这种令人头疼的情况发生,图纸加密就显得尤为重要。 别担心,今天我们就带你了解2024年六款超好用的图纸加密软件,让你的图纸“安全感”爆…

业务复杂度治理方法论--十年系统设计经验总结

一、复杂度综述 1、什么是复杂度 软件设计的核心在于降低复杂性。 --《软件设计的哲学》 业界对于复杂度并没有统一的定义,斯坦福教授John Ousterhout从认知负担和工作量方面给出了一个复杂度量公式   子模块的复杂度cp乘…

快充协议方案的工作原理及场景应用

快充协议芯片是支持各种快充快充协议的芯片,它们能智能识别插入的设备类型,并根据设备的需求调整充电电压和电流,从而实现快速充电。 XSP08Q芯片是内置快充功能的协议芯片,它基于先进的充电技术,通过协商电压和电流&a…

【数据结构】二叉树顺序存储结构堆的应用以及解决TOP-K问题

文章目录 前言1. 堆的应用1.1 堆排序1.2 TOP-K问题 2. 结语 前言 前面我们学习了堆这个数据结构,这种数据结构是一种顺序结构存储的完全二叉树,现在我们来看一看堆的应用。 1. 堆的应用 1.1 堆排序 版本一:基于已有数组建堆、取堆顶元素完…

Linux CentOS 部署Docker

1. yum 配置 (1)更新yum yum update -y 如果不升级更新yum 可能在后续docker部署后再更新容器会出现oci runtime error等 (2)安装yum工具类准备 yum install -y yum-utils device-mapper-persistent-data lvm2 (3&…

不再为存储‘分家’烦恼,teamOS让你的数据全家桶,一键即达

在数字化浪潮下,数据管理已成为企业运营的核心环节。作为企业管理者,我深知数据的重要性,也明白数据管理所面临的种种挑战。 最近开始使用企业网盘,在体验了一段时间后,目前来说,让我比较满意的就是可道云…

C盘红了怎么办?C盘快满了怎么办?如何提高电脑运行速度?

在电脑的日常使用中,C盘红了(也就是C盘满了),那是常有的事,本文将详述一下,C盘红了之后的多种处理方法,只要你看完了,就必有一款适合你。 一、系统自带的磁盘清理 当你的C盘红了&…

vue3 置空a-select数据

置空a-select数据 项目中遇到需求&#xff0c;选择第一个下拉框后&#xff0c;发请求获取数据第二个下拉框数据&#xff08;第二个下拉框已选的情况下需要置空&#xff09;。 解决方法&#xff1a;formData.value.checkUser {value: “” ,label:“”} <a-col :span"…

Win32中的字符串

ANSI字符和Unicode字符 在Visual C中&#xff0c;用CHAR来表示8位ANSI字符&#xff0c;用WCHAR来表示16位Unicode字符&#xff08;宽字符&#xff09; 1 typedef char CHAR 2 typedef wchar_t WCHAR 一般常用的定义如下 TypedefDefinitionCHARcharPSTR or LPSTRchar*PCSTR o…

一个跨平台的换源工具,一键更换操作系统上的软件源或镜像源

大家好&#xff0c;今天给大家分享的是一个全平台通用换源工具chsrc&#xff0c;旨在为各种软件在不同平台上提供从命令行进行换源的功能。 项目介绍 chsrc支持 Linux&#xff08;包括麒麟、openEuler、deepin 等&#xff09;、Windows、macOS、BSD 等多种操作系统&#xff0c…

MySQL数据类型-介绍

MySQL 支持多种数据类型&#xff0c;这些数据类型可以根据它们所存储的数据类型大致分为几类&#xff1a;数值类型、日期和时间类型、字符串&#xff08;字符&#xff09;类型、空间数据类型以及JSON数据类型。 一、数据类型 1.整数类型 TINYINT&#xff1a;非常小的整数。例…

第 2 章:AJAX 的使用

AJAX 的使用 核心对象&#xff1a;XMLHttpRequest&#xff0c;AJAX 的所有操作都是通过该对象进行的。 1. 使用步骤 创建 XMLHttpRequest 对象 var xhr new XMLHttpRequest(); 设置请求信息 xhr.open(method, url);//可以设置请求头&#xff0c;一般不设置 xhr.setReques…

计算机网络八股文之TCP协议

TCP/IP模型 链路层 物理层&#xff1a;主要定义物理设备标准&#xff0c;如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流&#xff08;就是由1、0转化为电流强弱来进行传输&#xff0c;到达目的地后再转化为1、0&#xff0c;也就是我们…

WPS Office for Linux 12 个人版上线deepin 23商店:UI 视觉重构,新增多项 AI 功能

查看原文 全新WPS Office For Linux个人版&#xff08;12.1.0.17881&#xff09;与deepin 23的AI功能深度融合&#xff0c;正式上架在社区商店啦&#xff01; 这是 Linux 版本的一次里程碑式的重大更新。在产品能力层面上&#xff0c;在 deepin 23 上WPS Office 几乎实现了与 …

30天一次过PMP资料分享!2024备考PMP必看!!!

1、华为项目管理工具模板 2、PMP思维导图 3、PMBOK指南第七版-中文电子版 4、敏捷电子书&#xff08;含敏捷实践指南&#xff09; 5、300道敏捷题 6、PMBOK第六版章节思维导图 PMP备考攻略&#xff1a; 1. 充分了解PMP考试大纲&#xff1a; 详细了解PMP考试大纲&#xff0c;明…

IEEE Latex模板子图标题字体修改

在进行IEEE期刊论文排版时&#xff0c;可能会用到子图&#xff0c;但官方的Latex模板中&#xff0c;子图标题字体与字号和图片标题不同&#xff0c;排版出来不美观&#xff0c;下面介绍一个简单方法解决这一问题。 在tex文件头部找到这一条代码&#xff1a; \usepackage[capti…

Spring学习(四)-AOP

Spring学习&#xff08;四&#xff09;-AOP –2020年06月26日 一、AOP的概念 面向切面编程。 利用AOP可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各部分之间的耦合度降低&#xff0c;提高程序的可重用性&#xff0c;同时提高了开发的效率。 通俗描述&am…