首页 > 其他分享 >https安全性 带给im 消息加密的启发

https安全性 带给im 消息加密的启发

时间:2024-04-01 15:12:17浏览次数:23  
标签:加密 摘要 im 密钥 https 服务端 客户端

大家好,我是蓝胖子,在之前# MYSQL 是如何保证binlog 和redo log同时提交的?这篇文章里,我们可以从mysql的设计中学会如何让两个服务的调用逻辑达到最终一致性,这也是分布式事务实现方式之一。今天来看看我们能够从httpsd设计中得到哪些启发可以用于业务系统开发中。

https原理分析

首先,我们来看下https 涉及到的握手流程,在http的三次握手基础上,https还要进行tls的握手协议。在经过tls握手后,后续客户端和服务端发送的消息也就都是加密的了。我们着重要看的就是tls握手过程。tls协议目前主要现存两个版本,我们都来看看。

tls1.2

首先,来看下tls1.2 协议下的握手流程。

在了解程序逻辑究竟为何如此设计之前,要搞懂我们这样做的目的。https之所以要用tls,无非就是为了两个目的,

  • 第一个目的: 让客户端能够认证服务端的身份信息,防止访问不安全的钓鱼网站。
  • 第二个目的: 对服务器和客户端之间的消息进行加密,不再明文传输。

对于第一个目的,可以通过数字证书解决,CA 向服务器颁发一个证书,在一次tls握手中,服务器会向客户端发放自己的证书,客户端在得到证书后向CA验证证书的合法性,如果合法,说明服务端是经过认证的,可以信任。

验证的原理则是通过公私钥加密算法和摘要算法,CA有自己的私钥,同时CA会将自己的公钥公布出去,然后CA对服务器的证书内容进行摘要计算,再对摘要进行私钥加密,私钥加密的内容只有公钥才能解密,私钥加密的内容称为签名信息,这段签名信息同样也会包含在证书中。

客户端在得到服务端证书的时候,通过对签名信息进行解密,得到证书的摘要信息,这个时候再对证书的内容进行摘要计算,看计算结果是否和解密得到的摘要信息一致,如果证书内容没被篡改的话,相同摘要算法得到的摘要信息应该是一致。

对于第二个目的,则是可以通过加密算法,为了性能,会话加密将会采用对称加密算法,这里的关键是得到一个会话密钥,但是为了安全性,会话密钥又不能直接采用明文进行传输。

所以tls是这样做的,客户端首先会生成一个随机数A,并已明文传递给服务端,服务端也会生成一个随机数B,并且把它传递给客户端,同时还会把数字证书传给客户端。数字证书中包含了服务端的公钥信息,客户端在收到证书取出其中公钥后,会再次生成一个随机数,随机数被称作pre master key ,这个随机数会通过证书中的公钥进行加密,传递给服务端,服务端会用自己的私钥对其进行解密,因为公钥加密的信息只能私钥才能解密,所以在服务端私钥不会泄露的情况下,黑客即使截获了报文,依然不能知道pre master key的值。

接着,便是服务端和客户端用相同的计算密钥的算法,以客户端和服务端的随机数A,B和pre master key生成相同的会话密钥,用于后续的通信进行对称加密。整个过程如下图所示,可以看到密钥的产生过程经历两次RTT,才会开始进行后续的请求发送。

请求一来一回称为一次RTT

image.png

关于tls1.2的完整握手过程,我也总结一个流程图,方便大家参考,

image.png

tls1.3

在了解了tls1.2的握手过程后,我们来看看tls1.3在握手过程中有哪些优化。tls1.3 废弃了一些密钥交换算法如RSA,默认用椭圆曲线ECDHE密钥交换算法,将密钥的产生时间从两次RTT缩短至了一次RTT。

废弃RSA密钥交换算法的另一个原因在于,使用RSA密钥交换算法,如果黑客持续截获https报文,如果数字证书中的公钥对应的服务端私钥泄露,那么黑客便可以将之前的历史报文进行解密,RSA密钥交换算法不具有前向安全性。前向安全指的是长期使用的主密钥泄漏不会导致过去的会话密钥泄漏

如下图所示,客户端和服务端都各自生成自己的一对用于ECDHE计算的随机公私钥和各自的随机数, 然后将各自的公钥和随机数传给对方,之后便可以各自通过这些信息计算出相同的会话密钥。

ECDHE 密钥交换具有前向安全性,因为参与会话密钥计算的私钥每次都是随机生成的,这样即使黑客获得了当前的私钥,也不能对历史https报文进行解密。

image.png

可以看到,ECDHE密钥交换算法只交换了各自的公钥便可以计算出会话密钥,即使黑客截获了消息内容,但是只有公钥,没有私钥也不能计算出会话密钥。我将tls1.3的握手过程总结到了下面的流程图中,大家可以参考下,

image.png

im消息加密解决方案

以上是https消息加密的实现原理,如果我们也想在消息传输中进行加密和认证处理,比如在im系统中对im消息加密,那么完全可以参考https的实现原理。

我们需要为im系统做消息加密消息防篡改的设计。

对于消息加密,参考https的交互,可以采用对称加密对后续会话内容进行对称加密,比如AES算法,加密的密钥可以采用ECDHE密钥交换算法,具有前向安全性。

对于消息防篡改,可以采用消息摘要算法,常见的摘要算法有md5,sha256,通过对加密后的报文进行摘要计算,在获取到报文的第一时间就通过对比计算出的消息摘要和报文中的消息摘要 来判断报文是否经过篡改。

更进一步,还可以设计一组只有im客户端和服务端知道的密钥,让客户端在进行摘要计算时,加上密钥,也就是通过类似hmac的消息认证算法,进行摘要计算,这样在对端接收到报文后,正常情况下,通过相同的消息认证算法和密钥会得到相同的摘要结果,如果计算的摘要结果和报文中的摘要结果不一致,那么说明报文不是从信任的客户端发来的,直接拒绝,这样便达到了消息认证的目的。

标签:加密,摘要,im,密钥,https,服务端,客户端
From: https://www.cnblogs.com/hobbybear/p/18108457

相关文章

  • Experiment
    要求:配置Telnet,要求所有网络设备均支持远程管理,密码为admin配置Trunk,交换机之间的链路均为Trunk模式配置VLAN,在SW2和SW3上创建相关VLAN,关联4台PC到对应的VLAN接口配置MLS,通过SW1实现VLAN间路由配置DHCP,使SW1可以为各个VLAN内主机分配地址信息配置STP,使SW1成为所有VLAN的根......
  • 如何部署HTTPS站点
    互联网协议HTTP与HTTPS的主要区别是什么?HTTPS相对于HTTP来说,使用了加密机制(TLS或SSL),即便数据在传输过程中被恶意截获,但依然无法获取到具体的数据内容,保证了安全性。HTTPS采用(CA)证书认证,用户在访问某个网站时,会进行证书的合法性,防止用户访问到假冒的网站,从而保护用户安全。......
  • SM4加密
    org.bouncycastle.jce.provider.BouncyCastleProvider;org.bouncycastle.pqc.math.linearalgebra.ByteUtils;javax.crypto.Cipher;javax.crypto.spec.SecretKeySpec;java.security.Key;java.security.Security;/*入参:str:EPIDEMIC_KEY*/StringENCODING="UTF-......
  • 抖音X-Bogus加密解析(全网最快)
     前言:    想着偷个懒,还是发现有想学习技术的兄弟,商量着把这个抖音的逆向给干一下,这个我都把要补的环境贴出来了,照着写上去不会嘛。有关xb的教学基本随处可见,苦思冥想后,还是暂时出一期教学,我们搞快点!直接一步写到位。                       ......
  • HTTPS工作原理
    工作大致过程1、客户端发起HTTPS请求浏览器里面输入一个HTTPS网址,然后连接到服务端的443端口上。注意这个过程中客户端会发送一个密文族给服务端,密文族是浏览器所支持的加密算法的清单。 2、服务端配置采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组......
  • Imagemagick 命令注入漏洞(CVE-2016-3714)
    Imagemagick命令注入漏洞(CVE-2016-3714)漏洞介绍漏洞名称:Imagemagick命令注入漏洞(CVE-2016-3714)漏洞定级:高危漏洞描述:ImageMagick在处理恶意构造的图片文件时,对于文件中的URL未经严格过滤,可导致命令注入漏洞。通过命令注入漏洞,黑客可以在服务器上执行任意系统命令,获取服务......
  • WPF中动画教程(DoubleAnimation的基本使用)
    实现效果今天以一个交互式小球的例子跟大家分享一下wpf动画中DoubleAnimation的基本使用。该小球会移动到我们鼠标左键或右键点击的地方。该示例的实现效果如下所示:页面设计xaml如下所示:<Windowx:Class="AnimationDemo.MainWindow"xmlns="http://schemas.microsof......
  • Vim替换
    作为一款强大的文本编辑器,Vim提供了多种方式进行文本替换,使得我们在处理文本时能够游刃有余。普通替换命令:s///在Vim中,最常用的替换命令是s///,其中s表示替换,三个斜杠代表分隔符。分隔符可以是任意字符,如s@@@、s###等,只要保证三个分隔符相同即可。基本格式如下:{作用范围}s/{目......
  • 加密软件VMProtect教程:使用脚本-功能
    VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、BorlandCBuilder、VisualC/C++、VisualBasic(本机)、VirtualPascal和XCode编译器。同时,VMProtect有一个内置的反汇编程序,可以与Windows和MacOSX可执行文件一起使用,并且还可以链接编译器创建的MAP文件,以快速选择......
  • Error in callback for immediate watcher “chartsData“: “Error: Initialize fail
     在使用echarts提示dom未找到,原因就是当我们封装了echarts组件初始化传值时通常会造成过早调用,也就是在数据还未处理完就已经调用init函数进行初始化,此时dom还未挂载成功,就会报这个错,这里解决可以使用nextTick()函数在初始化时延时调用;this.$nextTick(()=>{this.draw......