加密解密
1、非对称加密
公钥上锁,私钥打开
私钥上锁,公钥打开
2、数字签名
创建摘要,与加密文件里的摘要进行匹配
3、数字证书
私有证书:
openssl req (请求创建证书)
- x509——证书格式
- days 3650——证书有效时间3650天
- newkey rsa:1024——创建密钥,使用的算法rsa:1024
- nodes——不加密
- keyout server.key——密钥生成的文件
- out server.cert——证书生成的文件
下图是常用的加密算法,前三种是创建摘要
OpenSSL
概念
开源的SSL,而SSL即 Secure Sockets Layer,网络套接字加上安全机制,如非对称加密
TLS
国际安全组织对SSL 3.0进行了标准化,重新更改了名字,于是成为了TLS,Transport Layer Security
TLS是基于TCP协议的,它有两个步骤:
- TLS握手协议:下图的创建SSL上下文、加载证书、私钥
- TLS记录协议:下图的创建SSL实例
原理
- SSL_CTX:上下文,存放了版本、密钥、证书
- SSL:代表一个SSL连接,需要把一个socket当做参数放进去绑定,用来传输数据
- SSL_Write/SSL_Read:socket的读写函数
使用
DTLS协议
它是基于UDP协议的
WebRTC默认是aes 128加密算法
DTLS握手协议
利用了非对称加密算法
1、客户端先发送Hello
注:这里的客户端并不是指真正的客户端,实际上哪边先发送Hello哪边就被称作客户端
2、服务端回复Hello,并发送自己的证书、私钥
3、客户端回复证书、私钥,并发送加密套件
4、服务端确认加密套件
DTLS时序图
第一步:媒体协商,交换SDP,其最重要的是ICE中的usr_name和password
第二步: STUN协议的Request,也是发送usr_name和password,然后对方会把收到的usr_name和password与媒体协商中获得的usr_name和password进行对比;若一致的便是合法用户,便会回复Response
第三步:现在才是DTLS四次握手
第四步:互相发送SRTP数据,SRTP是加密后的RTP数据
SRTP
SRTP的协议头和RTP相同,故头部不加密,在payload里面才会加密
在WebRTC中,一般不用MKI(must K indicate,主K标识符),所以为0
Authentication Tag:用来进行完整性验证。发送端将RTP数据头与RTP的加密数据做一次哈希函数运算,计算出摘要,附加在加密数据尾部。接收端收到后会再一次把数据头和加密数据做相同的哈希运算,若得出的结果与摘要匹配,才会进行数据解密
两个功能:
- 保证数据完整性
- 对数据加密解密
libsrtp
思科开源的一个srtp库,对性能优化得非常棒,损耗可以忽略不记
市面上所有开源的WebRTC流媒体服务器都使用的libsrtp,它用起来也很简单方便
下图是使用libsrtp的过程
第一步:对libsrtp做初始化
第二步:创建Session,在DTLS握手之后,拿到SSL实例(握手交换的信息都在里面,包括profile里的加密算法、密钥等),把这些信息都设置到Session中便能进行对数据的加密解密。注意:在流媒体服务器中创建的Session有两个,分别用于输出流和输入流,对输出流加密,输入流解密
第三步:加密和解密
另外有个博主的文章也写得不错:SSL/TLS/DTLS对比