从零开始精通RTSP之加密

概述

        原始的RTSP通信默认使用的是明文传输,这也就意味着,在网络上的任何节点都能轻易地查看或修改传输的内容。这在涉及隐私或版权保护的场景下,是完全不可接受的。因此,加密显得尤为重要。加密的目的主要有三点:一是进行身份验证,确认通信双方的身份;二是确保数据在传输过程中,不被未经授权的第三方读取;三是保证数据的完整性,确保数据在传输过程中不被篡改。

        为了加密传输信令和码流,确保媒体数据的安全性,通常采取以下两种策略:RTSP Over TLS、SRTP。

RTSP Over TLS

        RTSP Over TLS是指在RTSP协议通信过程中,使用TLS(Transport Layer Security)协议或SSL(Secure Sockets Layer)协议对RTSP信令消息进行加密传输,以保护通信内容的安全性和隐私性。这类似于HTTPS对于HTTP的加密方式,提高了协议的安全等级。

        实现RTSP Over TLS的大致步骤如下。

        1、证书准备。我们需要为RTSP服务器配置一个有效的SSL/TLS证书,证书可以是从受信任的CA(Certificate Authority,证书颁发机构)购买的证书,也可以是自签名证书(主要用于测试环境,生产环境不推荐)。

        2、服务器配置。大多数现代的RTSP服务器软件(比如:VLC、GStreamer等)都支持TLS加密,我们需要在服务器配置文件中指定证书和私钥的路径,并启用TLS端口。TLS端口默认是443,也可以是其他端口,比如:554等。

        3、客户端连接。客户端需要使用支持TLS的RTSP URL来发起连接请求,格式通常为:

                rtsps://address:port/path

        上面的“rtsps”表示安全连接,即TLS加密。

        4、握手与验证。连接建立过程中,客户端与服务器会执行TLS握手,验证服务器证书的有效性。如果证书被客户端信任,则建立加密连接。否则,连接可能会失败。

        注意:默认的RTSP端口是554,但未指定是否加密。使用TLS时,通常建议使用443端口,这是TLS的标准端口。当然,也可以选择其他端口,并明确告知客户端。TLS加密会增加额外的CPU负载,尤其是在视频流传输这样对实时性要求较高的场景中,需要确保服务器有足够的处理能力。另外,RTSP Over TLS只会对RTSP的信令进行加密,并不会对媒体流进行加密。

SRTP

        对于媒体流的加密,最常用的是SRTP(Secure RTP)。SRTP是一种专为RTP设计的安全增强层协议,是对RTP协议的扩展,提供了对媒体流数据包的加密、消息认证、重放保护和密钥管理等功能。它支持多种加密算法,比如:AES-CM、AES-GCM等。同样的,RTCP协议也可以扩展为更安全的SRTCP(Secure RTCP)。

        SRTP的报文格式如下,其Payload部分是加密的。可以看到,除了末尾的SRTP MKI和authentication tag外,其他与RTP报文完全相同。

        SRTP MKI :可选,用于标识主密钥。MKI不受完整性保护,因为这不提供任何额外保护。

        Authentication Tag:推荐使用,认证标签,用于携带消息认证数据。SRTP数据包的认证部分由RTP头和加密的Payload部分组成。身份验证标签可以提高对RTP头和有效载荷的身份验证,并通过对序列号进行身份验证来间接提供重放保护。

      0                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+|V=2|P|X|  CC   |M|     PT      |       sequence number         | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ||                           timestamp                           | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ||           synchronization source (SSRC) identifier            | |+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ ||            contributing source (CSRC) identifiers             | ||                               ....                            | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ||                   RTP extension (OPTIONAL)                    | |+>+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || |                          Payload  ...                         | || |                               +-------------------------------+ || |                               | RTP padding   | RTP pad count | |+>+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+| ~                     SRTP MKI (OPTIONAL)                       ~ || +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || :                 Authentication Tag (RECOMMENDED)              : || +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |

        实现SRTP的大致步骤如下。

        1、会话建立。首先,客户端发送一个OPTIONS请求来查询服务器支持的命令集。虽然这一步不是必须的,但在某些情况下有助于客户端了解服务器的能力。然后,客户端发送DESCRIBE请求获取会话描述信息,SDP中可能包含有关媒体类型、编码、端口等信息。对于SRTP,SDP中还可能包含安全属性行(比如:a=crypto),以表明支持安全传输。

        2、协商加密。在RTSP的SETUP请求和响应中,客户端和服务器协商使用SRTP。比如:客户端可以请求使用SRTP传输。

SETUP rtsp://server.example.com/stream/trackID=1 RTSP/1.0
Transport: RTP/SAVPF;unicast;client_port=49154-49155

        密钥的协商,可以通过外部机制(比如:DTLS-SRTP、SDES 、ZRTP等)来进行。如果使用DTLS-SRTP,客户端和服务器会在RTSP SETUP之后,基于RTSP提供的传输信息,建立DTLS连接,通过DTLS通道安全地交换SRTP密钥和参数。

        3、初始化SRTP上下文。一旦密钥通过DTLS-SRTP成功交换,客户端和服务器都会使用这些密钥初始化各自的SRTP和SRTCP上下文。

        4、开始播放。客户端发送PLAY请求,开始媒体流的传输。此时,所有RTP和RTCP数据包都通过之前建立的安全通道传输,并应用SRTP/SRTCP进行加密和认证。

        5、媒体流加密传输。在媒体流传输期间,RTP数据包被加密并通过安全的通道传输,而RTCP包用于质量控制和反馈,同样受到SRTCP的保护。

        6、会话结束。当会话结束时,除了RTSP的TEARDOWN信令外,还需要确保所有安全上下文被正确清理,包括释放DTLS连接和废弃SRTP密钥,以保障安全性。

总结

        为了全面保护RTSP流媒体通信的全流程,通常会结合使用RTSP Over TLS来加密控制信令,以及SRTP来加密媒体流,形成一个从控制到数据传输的全方位安全体系。这种组合确保了从会话建立到媒体播放的每一个环节都受到保护,满足了高安全标准的实时流媒体传输需求。

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

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

相关文章

拧紧设备或工具的选型原则、常见类型和选型关键因素有哪些?

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 在工业生产领域&#xff0c;拧紧控制是一项至关重要的工艺环节。它涉及螺栓、螺母等紧固件的装配过程&#xff0c;直接关系到产品的质量和性能。因此&#xff0c;选择合适的拧紧设备或工具对于确保拧紧过程的准确性和稳…

[牛客网]——C语言刷题day4

答案&#xff1a;B 解析&#xff1a; a是数组首元素的地址,a1的步长是int&#xff0c;所以是2 &a是数组的首地址&#xff0c;&a1步长是int[5] ptr是int类型的指针&#xff0c;指向a数组的尾后位置&#xff0c;ptr-1的步长是int,所以是a数组的最后一个元素5 答案&am…

如何使用ffmpeg 实现10种特效

相关特效的名字 特效id 特效名 1 向上移动 2 向左移动 3 向下移动 4 颤抖 5 摇摆 6 雨刷 7 弹入 8 弹簧 9 轻微跳动 10 跳动 特效展示(同时汇总相关命令) pad背景显示 pad背景透明 相关命令(一会再讲这些命令&#xff0c;先往下看) # 合成特效语音 ffmpeg -y -loglevel erro…

Element Plus/vue3 无限级导航实现

在使用element plus 时&#xff0c;最初要使用的就是导航组件了&#xff0c;官网上看到的也就是写死的一级/二级导航&#xff0c;那么如何设计一个无限级且动态的导航呢&#xff1f;毋庸置疑&#xff0c;递归。废话不多说&#xff0c;直接看代码和效果&#xff1a; 代码&#x…

Jmeter:录制脚本(操作文档)

新建线程组 打开jmeter&#xff0c;右键测试计划–>添加–>Threads(Users)–>点击"线程组" 添加录制控制器 右键线程组–>添加–>逻辑控制器–>点击"录制控制器" 添加HTTP代理服务器 右键工作台–>添加–>非测试元件–>…

YOLOv5改进 | Neck | 添加双向特征金字塔BiFPN【小白轻松上手 | 论文必备】

&#x1f680;&#x1f680;&#x1f680;本专栏所有的改进均可成功执行&#x1f680;&#x1f680;&#x1f680; 尽管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作为一个anchor base的目标检测的算法&#xff0c;YOLOv5可能比YOLOv8的效果更好。但是针对不同的数据…

CDN都有哪些优势?

内容分发网络是一个经策略性部署的整体系统&#xff0c;其中包含了分布式存储、负载均衡、网络请求的重定向和内容管理四个要求&#xff0c;CDN的主要核心则是内容管理和全局的网络流量管理&#xff0c;CDN可以确保内容会以一种非常高效的方式为用户的请求提供服务。 接下来就让…

Linux 第三十五章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

Kubernetes安装calico网络插件失败

今天啥也没干成&#xff0c;不想排版了。 接着昨天搭建k8s集群&#xff0c;安装calico插件&#xff0c;虚拟机一直卡。 # 在 master 节点上执行 # 下载 calico 配置文件&#xff0c;可能会网络超时 curl https://docs.tigera.io/archive/v3.25/manifests/calico.yaml -O # 修…

[svelte] 怎么引入fortawesome的icon样式

首先在项目的终端下执行以下命令 npm install fortawesome/fontawesome-free # 或者 yarn add fortawesome/fontawesome-free这样子可以把fontawsome的图标给下载到项目的对应文件中 一般都是在node_modules中 在fontawsome/fontawesome-free中就可以看到很多文件夹了 …

unapp写微信小程序封装水印相机组件怎么实现?

<template><view><!-- <cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"backText">返回</block><block slot"content">编辑资料</block></cu-custom> --><…

Docker学习(10)搭建kubernetes集群

搭建kubernetes集群 1、官方部署方式&#xff1a; Minikube工具安装 Minikube是一种能够在计算机或者虚拟机(VM)内轻松运行单节点Kubernetes 集群的工具&#xff0c;可实现一键部署。这种方式安装的系统在企业中大多被当作测试系统使用。 使用yum安装 通过直接使用 epel-r…

三步在 vite 中配置 tailwindcss

前言 tailwindcss 是一个原子化的 css 工具&#xff0c;可以让你免于写 css&#xff0c;只写 html 即可原理&#xff1a;利用你写的 html 的 class 名称来生成 css 样式&#xff0c;理解为一个 postcss 插件或 loader 第一步&#xff1a;安装 tailwindcss npm i -D tailwind…

图片恢复的实用指南,为你拯救遗失的记忆!

随着科技的日新月异&#xff0c;我们的生活已被照片填满。它们记录着我们的喜怒哀乐&#xff0c;见证着每一个重要的时刻。但我们往往会因为各种原因将手机图片遗失&#xff0c;有什么方法可以恢复呢&#xff1f;本文将提供一份实用的图片恢复指南&#xff0c;帮助你找回那些遗…

山西大学化学化工学院朱凤祥教授简介

男&#xff0c;1989年出生&#xff0c;河南安阳人&#xff0c;2019年1月于山西大学化学化工学院任特聘教授&#xff0c;主要研究方向为有机催化&#xff0c;曾获国家自然科学基金资助&#xff08;2020-2023&#xff09;&#xff0c;迄今在国际高级杂志发表SCI论文20余篇。 200…

llama使用tutorial微调(windows版本)

Llama3-Tutorial/docs/assistant.md at main SmartFlowAI/Llama3-Tutorial GitHub 有一些命令需要修改 前期的安装还是要按照教程搞的 streamlit run ~/Llama3-Tutorial/tools/internstudio_web_demo.py \ ~/model/Meta-Llama-3-8B-Instruct 改为了 streamlit run .\Ll…

ArrayList和LinkedList的使用

ArrayList List<> list new ArrayList<>(); LinkedList

SQL注入漏洞常用绕过方法

SQL注入漏洞 漏洞描述 Web 程序代码中对于用户提交的参数未做过滤就直接放到 SQL 语句中执行&#xff0c;导致参数中的特殊字符打破了原有的SQL 语句逻辑&#xff0c;黑客可以利用该漏洞执行任意 SQL 语句&#xff0c;如查询数据、下载数据、写入webshell 、执行系统命令以及…

WPF使用ItemsControl显示Object的所有属性值

对于上位机开发&#xff0c;我们有时候有这样的需求&#xff1a;如何显示所有的IO点位&#xff1f;比如有10个IO点位&#xff0c;那我们要写10个TextBlock去绑定这10个点位的属性&#xff08;本文暂时不考虑显示的样式&#xff0c;当然也可以考虑&#xff09;&#xff0c;当点位…

springboot整合swagger,jpa遇到的问题

1.整合jpa&#xff0c;版本问题导致Archive for required library: ‘C:/Users/Administrator/.m2/repository/org/aspectj/aspectjweaver/1.8.13/aspectjweaver-1.8.13.jar’ in project ‘money-server’ cannot be read or is not a valid ZIP file money-server Build path…