SIP系列五:HTTP(SIP)鉴权

        我的音视频/流媒体开源项目(github)

        SIP系列目录

目录

一、基本认证(basic)

二、摘要认证(digest)

1、摘要认证(digest) RFC 2069​

2、摘要认证(digest) RFC 2617​

2.1、未定义qop字段或值为"'(空)

2.2、qop值为"auth"

2.3、qop值为"auth-int"

2.4、RFC 2617​认证示例


        在《SIP系列三:SIP消息格式》中的注册示例里面包含了鉴权,本篇文章将详细介绍一下SIP的鉴权机制。

        SIP鉴权使用的就是HTTP的鉴权方式,很多类HTTP协议使用的都是HTTP的鉴权方式,例如RTSP。

        HTTP协议包括两种鉴权方式:基本认证(basic)和摘要认证(digest)。

一、基本认证(basic)

        对用户名和密码以<username:password>格式进行base64编码,添加Authorization字段发起请求:

        示例:

DESCRIBE rtsp://10.175.30.35 RTSP/1.0
CSeq: 7
Authorization: Basic YWRtaW46YWJjZDEyMzQ=
Accept: application/sdp

        “YWRtaW46YWJjZDEyMzQ=” 就是username:password 的base64值。服务端对其解码得到用户名和密码进行鉴权。这种认证方式缺乏安全性,现在已经不用了。

二、摘要认证(digest)

        摘要有过两个版本分别来自RFC 2069​和RFC 2617​。RFC 2617兼容RFC 2069版本。

        摘要认证使用MD5算法计算由用户名、密码和随机数等组成的哈希值,通过该哈希值进行身份验证。

        摘要认证公式为:

A1 = ?
A2 = ?
D = ?
HA1 = MD5(A1)
HA2 = MD5(A2)
response = MD5(HA1:D:HA2)

        RFC 2069​和RFC 2617都是使用上面的公式,但对于A1、A2、D的定义RFC 2069​和RFC 2617就有所不同了。 

1、摘要认证(digest) RFC 2069​

        RFC 2069​中关于A1、A2、D的定义如下:

A1 = username:realm:password
A2 = method:uri # 请求报文中的method和url
D = nonce
response = MD5(MD5(A1):D:MD5(A2))

        下面是一个使用RFC 2069鉴权的示例(RTSP):


---------------C->S--------------
DESCRIBE rtsp://192.168.10.18:8554/live RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp---------------S->C--------------
RTSP/1.0 401 Unauthorized
CSeq: 3
WWW-Authenticate: Digest realm="simple-rtsp-server", nonce="fea261aa3d9310f32b2a9d8e1454fa3c"---------------C->S--------------
DESCRIBE rtsp://192.168.10.18:8554/live RTSP/1.0
CSeq: 4
Authorization: Digest username="admin", realm="simple-rtsp-server", nonce="fea261aa3d9310f32b2a9d8e1454fa3c", uri="rtsp://192.168.10.18:8554/live", response="6b6f6d63581262aa05ee4ddada5c3f6b"
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp---------------S->C--------------
RTSP/1.0 200 OK
CSeq: 4
Content-Base: rtsp://192.168.10.18:8554/live
Content-type: application/sdp
Content-length: 375v=0
o=- 91722585321 1 IN IP4 192.168.10.18
c=IN IP4 192.168.10.18
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
a=control:track0
m=audio 0 RTP/AVP 97
a=rtpmap:97 MPEG4-GENERIC/44100/2
a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;config=1390;sizelength=13;indexlength=3;indexdeltalength=3
a=control:track1

2、摘要认证(digest) RFC 2617​

        RFC 2617​比RFC 2069​增加了​​qop​、cnonce​​、nonce-count(nc)​​字段。

        ​​qop​​ 保护质量(quality of protection),是一个可选值,由服务器提供,用来兼容RFC 2069,​​qop​​字段分几种情况:未定义qop字段或值为"'(空)、"auth"、"auth-int"。

        cnonce​​ 客户端提供的字符串,用以双向认证;当有 ​​qop​​ 时必须携带,否则必须不带。

        nonce-count​​ 客户端提供的访问请求数量(包括此次请求),采用16进制表示,用以校验请求是否重复;当有 ​​qop​​ 时必须携带,否则必须不携带。

2.1、未定义qop字段或值为"'(空)

        兼容RFC 2069,定义和RFC 2069完全一样:

A1 = username:realm:password
A2 = method:uri
D = nonce
response = MD5(MD5(A1):D:MD5(A2))

2.2、qop值为"auth"

algorithm的值是MD5:A1 = username:realm:password
algorithm的值是MD5-sess:A1 = MD5(username:realm:password):nonce:cnonce
A2 = method:uri
D = nonce:nc:cnonce:qop
response = MD5(MD5(A1):D:MD5(A2))

2.3、qop值为"auth-int"

algorithm的值是MD5:A1 = username:realm:password
algorithm的值是MD5-sess:A1 = MD5(username:realm:password):nonce:cnonce
A2 = method:uri:MD5(entityBody) # entityBody请求的整个消息体
D = nonce:nc:cnonce:qop
response = MD5(MD5(A1):D:MD5(A2))

        当qop有值,但是cnonce​​、nonce-count​​没有定义的时候(即服务端首次返回Unauthorized的时候有qop,无cnonce​​、nonce-count(nc)​​,因为cnonce​​、nonce-count(nc)​​是客户端提供的),则公式中的"D = nonce:nc:cnonce:qop"用"D = nonce:::qop"代替。

2.4、RFC 2617​认证示例

        下面是SIP用户代理向服务器注册的鉴权示例:

// 第一次请求
REGISTER sip:192.168.2.89 SIP/2.0Via: SIP/2.0/UDP 192.168.2.161:8021
Max-Forwards: 70
From: <sip:01062237493@192.168.2.89>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:01062237493@192.168.2.89>
Call-ID: c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161
CSeq: 1 REGISTER
Contact: <sip:192.168.2.161:8021>;methods="INVITE, MESSAGE, INFO, SUBSCRIBE, OPTIONS, BYE, CANCEL, NOTIFY, ACK, REFER"
User-Agent: RTC/1.2.4949 (BOL SIP Phone 1005)
Event: registration
Allow-Events: presence
Content-Length: 0// 服务器授权不通过
SIP/2.0 401 UnauthorizedVia: SIP/2.0/UDP 192.168.2.161:8021
From: <sip:01062237493@192.168.2.89>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:01062237493@192.168.2.89>;tag=-001893-38ba013ba3dde36e
Call-ID: c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161
CSeq: 1 REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: <sip:192.168.2.89:14010>
Content-Length: 0
WWW-Authenticate: Digest realm="192.168.2.89", qop="auth", nonce="e17d377c3d2d9c343e26576a7fd04738481dfc10", opaque="", stale=FALSE, algorithm=MD5// 客户端第二次发起请求
REGISTER sip:192.168.2.89 SIP/2.0Via: SIP/2.0/UDP 192.168.2.161:8021
Max-Forwards: 70
From: <sip:01062237493@192.168.2.89>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:01062237493@192.168.2.89>
Call-ID: c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161
CSeq: 2 REGISTER
Contact: <sip:192.168.2.161:8021>;methods="INVITE, MESSAGE, INFO, SUBSCRIBE, OPTIONS, BYE, CANCEL, NOTIFY, ACK, REFER"
User-Agent: RTC/1.2.4949 (BOL SIP Phone 1005)
Authorization: Digest username="01062237493", realm="192.168.2.89", qop=auth, algorithm=MD5, uri="sip:192.168.2.89", nonce="e17d377c3d2d9c343e26576a7fd04738481dfc10", nc=00000001, cnonce="12660455546344082314666316435946", response="f57e47ce03162293b9ced07362ce2b79"
Event: registration
Allow-Events: presence
Content-Length: 0// 服务器鉴权通过,返回200 OK
SIP/2.0 200 OKVia: SIP/2.0/UDP 192.168.2.161:8021
From: <sip:01062237493@192.168.2.89>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:01062237493@192.168.2.89>;tag=-001894-a5eb977c8969aa51
Call-ID: c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161
CSeq: 2 REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: sip:192.168.2.161:8021
Content-Length: 0
Expires: 3600

        上述例子中opaque 是一个防止重放攻击的机制,是服务器在401 Unauthorized响应中生成,客户端在后续请求中带上这个字段即可。客户端不理睬这个字段也可以,但是有些服务器可能会认证失败。

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

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

相关文章

解决kali xterm终端中英文字符过宽、中文乱码问题

编辑并保存以下内容 root用户 nano ~/.Xresources XTerm*faceName: DejaVu Sans Mono XTerm*faceName2: Noto Sans CJK SC XTerm*background: #000000没有终端背景变白的问题可以不加 XTerm*background: #000000 重新加载配置生效 xrdb ~/.Xresources 自动加载 .Xresource…

2020年国赛高教杯数学建模E题校园供水系统智能管理解题全过程文档及程序

2020年国赛高教杯数学建模 E题 校园供水系统智能管理 原题再现 校园供水系统是校园公用设施的重要组成部分&#xff0c;学校为了保障校园供水系统的正常运行需要投入大量的人力、物力和财力。随着科学技术的发展&#xff0c;校园内已经普遍使用了智能水表&#xff0c;从而可以…

最新版Chrome谷歌加载ActiveX控件之金格iWebOffice2015控件

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

【Flink-scala】DataStream编程模型之水位线

DataStream API编程模型 1.【Flink-Scala】DataStream编程模型之 数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之 窗口计算-触发器-驱逐器 文章目录 DataStream API编程模型前言…

VoCo-LLaMA: Towards Vision Compression with Large Language Models

视觉语言模型在各种多模态任务上取得了显著的成功&#xff0c;但经常受到有限上下文窗口和处理高分辨率图像输入和视频的高计算成本的瓶颈。视觉压缩可以通过减少视觉令牌数量避免该问题。先前方法使用额外模块压缩视觉令牌并强制LLM理解压缩的令牌。然而&#xff0c;LLM对视觉…

iOS平台接入Facebook登录

1、FB开发者后台注册账户 2、完善App信息 3、git clone库文件代码接入 4、印尼手机卡开热点调试 备注&#xff1a; 可能遇到的问题&#xff1a; 1、Cocos2dx新建的项目要更改xcode的git设置&#xff0c;不然卡在clone&#xff0c;无法在线获取FBSDK 2、动态库链接 需要在…

unity打包web,发送post请求,获取地址栏参数,解决TypeError:s.replaceAll is not a function

发送post请求 public string url "http://XXXXXXXXX";// 请求数据public string postData "{\"user_id\": 1}";// Start is called before the first frame updatevoid Start(){// Post();StartCoroutine(PostRequestCoroutine(url, postData…

VTK编程指南<三>:基于VTK入门程序解析来理解VTK基础知识

1、VTK入门程序 下面是一个完整的Vtk入门程序&#xff0c;我们基于这个程序来对VTK的基本知识进行一个初步了解。 #include <iostream>#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INI…

IMP-00038: 无法转换为环境字符集句柄

问题 在导入oracle数据库文件的时候报这个报错&#xff0c;原因是你使用的是imp命令导入的使用expdp命令导出的dmp文件导致的。 原因 关于imp命令和expdp命令 exp和imp是客户端的工具程序命令&#xff0c;既可以在客户端使用&#xff0c;也可以在服务端使用。 expdp和impd…

大语言模型应用Text2SQL本地部署实践初探

自从两年前OpenAI公司发布ChatGPT后&#xff0c;大模型(Large Language Model&#xff0c;简称LLM)相关技术在国内外可谓百家争鸣&#xff0c;遍地开花&#xff0c;在传统数据挖掘、机器学习和深度学习的基础上&#xff0c;正式宣告进入快速发展的人工智能(Artificial Intellig…

shell脚本实战案例

文章目录 实战第一坑功能说明脚本实现 实战第一坑 实战第一坑&#xff1a;在Windows系统写了一个脚本&#xff0c;比如上面&#xff0c;随后上传到服务&#xff0c;执行会报错 原因&#xff1a; 解决方案&#xff1a;在linux系统touch文件&#xff0c;并通过vim添加内容&…

Power BI - 批量导入数据

1.简单介绍 假定已经使用Power Automate Desktop(微软的RPA产品&#xff0c;是Power Platform平台的其中一个产品)从福布斯中文网获取了各地区的2024年的财富数据如下&#xff0c; 现在想批量导入数据到Power BI中&#xff0c;分析一下各地区的产业以及财富情况 2.具体说明 …

医疗系统国产数据库高质量发展路径探析

信息工程人员操作数据库 一、国外数据库在医疗系统中的困境 &#xff08;一&#xff09;数据分散与难以整合 在美国&#xff0c;分散式医疗服务成为癌症研究数据库优化的巨大障碍。患者先在社区接受肿瘤科医生常规检查&#xff0c;再到学术医疗中心进行尖端治疗&#xff0c;然…

Maven 打包出现问题解决方案

我执行 mvn install 报如下错误 可是我在 web 模块中能正确引用到 common 的类&#xff0c;于是我把 web 引用到的 common 中的类先移动到 web 模块中&#xff0c;然后把 common 模块的类都删掉&#xff0c;然后再次执行 mvn install,结果报错如下&#xff1a; [ERROR] Faile…

微信小程序里的小游戏研发需要什么技术栈

研发小程序里的小游戏通常需要以下技术栈&#xff1a; 前端技术 HTML5 / CSS3&#xff1a;用于构建游戏的界面布局和样式。JavaScript&#xff1a;作为核心编程语言&#xff0c;实现游戏的逻辑和交互。小程序开发框架&#xff1a;如微信小程序的开发框架&#xff0c;了解其 API…

NIO(New IO)和BIO(Blocking IO)的区别

Java中的NIO&#xff08;New IO&#xff09;和BIO&#xff08;Blocking IO&#xff09;的区别及NIO的核心组件 Java中的NIO&#xff08;New IO&#xff09;和BIO&#xff08;Blocking IO&#xff09;是两种不同的网络通信模型&#xff0c;各自具有独特的特性和适用场景。下面将…

RabbitMQ延迟消息的实现

RabbitMQ延迟队列的实现 延迟消息是什么延迟消息的实现死信交换机代码实现 延迟消息插件 延迟消息是什么 延迟消息是将消息发送到MQ中&#xff0c;消费者不会立即收到消息&#xff0c;而是过一段时间之后才会收到消息&#xff0c;进行处理。在一些业务中&#xff0c;可以用到延…

HTML5 拖拽 API 深度解析

一、HTML5 拖拽 API 深度解析 1.1 背景与发展 HTML5 的拖拽 API 是为了解决传统拖拽操作复杂而设计的。传统方法依赖鼠标事件和复杂的逻辑计算&#xff0c;而 HTML5 提供了标准化的拖拽事件和数据传递机制&#xff0c;使得开发者能够快速实现从一个元素拖拽到另一个元素的交互…

3D 生成重建017-StyleGaussian用文本或图像对你的3DGS内容进行风格迁移

3D 生成重建017-StyleGaussian用文本或图像对你的3DGS内容进行风格迁移 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文 “StyleGaussian: Instant 3D Style Transfer with Gaussian Splatting” 介绍了一种新颖的3D风格迁移方法 StyleGaussian&#xff0c;该方法通…

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键&#xff0c;打开如下界面&#xff0c;选择【系统】&#xff1a; 2、选择【屏幕】-【高级显示设置】 如下位置&#xff0c;显示屏幕的刷新率&#xff1a;60Hz 如果可以更改&#xff0c;则选择更高的刷新率&#xff0c;有助于电脑使用起来界面更加流…