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

news2024/12/23 4:09:25

大家好,我是蓝胖子,在之前# 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,客户端对服务端的消息认证却是通过数字证书的认证完成的。

这是因为在通信前,客户端和服务端对于彼此是未知的,它们只能通过一个已知的第三方机构CA完成这样的认证。

而我们自己写的程序就不一样,可以设计一个密钥让im客户端和im服务端程序都使用这个密钥对报文进行hmac消息认证,因为密钥只有自己的程序知道,如果得到的认证码和计算出的不一致,那么消息必然来自第三方。

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

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

相关文章

VTK中polydata的属性数据结构表示和用法

vtk中通过vtkDataArray进行数据的存储,通过vtkDataObject进行可视化数据的表达,在vtkDataObject内部有一个vtkFieldData的实例,负责对数据的表达: vtkFieldData存储数据的属性数据,该数据是对拓扑结构和几何结构信息的…

项目管理计划

《项目管理计划》 1.项目背景说明 2.项目目标和范围 3.项目组织架构 4.项目进度管理办法 5.项目沟通管理 6.项目风险管理 软件开发全套资料包获取进主页或文末个人名片直接获取。

Excel 数据-分列的三个经常用法

Case 1 :有时候数据导出时如果没有电子表格的话,只能导出本地文件,如下图情况: 可以使用数据-分列处理数据: 原来是因为SAP导出数据没有完成的原因,或者关闭Excel重新打开试一下。 重新打开后可以输入了 C…

日记本(源码+文档)

日记本(小程序、ios、安卓都可部署) 文件包含内容程序简要说明功能项目截图客户端首页日记列表 书写日记个人中心设置密码锁拨打客服热线修改信息退出登录登录页输入密码锁注册页 后端管理登录页首页管理员列表管理用户管理日记列表管理日记数据 文件包含…

2024年网络安全运营体系建设方案

以下是部分WORD内容,请您参阅。如需下载完整WORD文件,请前往星球获取: 网络安全运营监控工作整体构想 工作目标及原则 工作目标 为进一步落实强化公司网络安全保障,有效支撑公司数字化转型战略,建立健全公司网省两级协…

Tomcat调优总结

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例,讲解参数。 同时也得认识到一点,tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。 因此可以将…

无锡国家集成电路设计中心某公司的单锂小电机直流电机H桥驱动电路

H桥驱动 L9110S是一款直流电机驱动电路,适合单节锂电池应用。输出电流0.4A。价格约3毛。 推荐原因: 某些人应该知道这个地方,大多数人应该不知道这个地方,所以推荐一下。 这个地方去过几次,某公司与某方走的“近”&…

用Wireshark解码H.264

H264,你不知道的小技巧-腾讯云开发者社区-腾讯云 这篇文章写的非常好 这里仅做几点补充 init.lua内容: -- Set enable_lua to false to disable Lua support. enable_lua trueif not enable_lua thenreturn end-- If false and Wireshark was start…

31.2k star, 免费开源的白板绘图工具 tldraw

31.2k star, 免费开源的白板绘图工具 tldraw 分类 开源分享 项目名: tldraw -- 无限画布白板 Github 开源地址: https://github.com/tldraw/tldraw 在线测试地址: tldraw 文档地址: tldraw SDK tldraw 是一款开源免费的无限画布白板&…

【NC14326】Rails

题目 Rails 栈 翻译 由于原题是英文的,所以这里先翻译一下: PopPush市有一个著名的火车站。那里的山地多得令人难以置信。这个车站建于上个世纪。不幸的是,当时资金极为有限。只能建立一条地面轨道。此外,事实证明,火…

PurpleKeep:提供Azure管道以创建基础设施并执行Atomic测试

关于PurpleKeep PurpleKeep是一款功能强大的安全测试自动化工具,该工具能够通过提供Azure管道以创建基础设施,并帮助广大研究人员执行Atomic测试。 随着攻击技术种类的迅速增加,以及EDR(端点检测和响应)和自定义检测规…

[leetcode] 637. 二叉树的层平均值

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[3.00000,14.50000,11.00000] 解释:第 0 层的平均值…

FMEA引领智能家居安全革新,打造无忧智能生活新纪元!

在智能家居日益普及的今天,如何确保家居安全成为消费者关注的焦点。本文将探讨如何通过FMEA(故障模式与影响分析)这一强大的质量管理工具,为智能家居赋能,打造安全无忧的智能生活新体验。 一、FMEA在智能家居领域的应用…

Electron的学习

目录 项目初始化可以看官网非常详细根路径创建.vscode文件夹主进程和渲染进程之前的通信ipcRenderer.send和ipcMain.on的使用ipcRenderer.invoke和ipcMain.handle的使用 切换主题模式文件拖放保存消息通知进度展示图标闪烁自定义菜单自定义右键菜单 项目初始化可以看官网非常详…

基于ArgoCD和Testkube打造GitOps驱动的Kubernetes测试环境

本文介绍了一项新工具,可以基于Gitops手动或者自动实现Kubernetes集群应用测试,确保集群的健康状态与Git仓库定义的一致。原文: GitOps-Powered Kubernetes Testing Machine: ArgoCD Testkube 简介:GitOps 云原生测试面临的挑战 现代云原生应…

Qt中出现中文乱码的原因以及解决方法

Qt专栏:http://t.csdnimg.cn/C2SDN 目录 1.引言 2.原因分析 3.源文件的编码格式修改方法 4.程序内部使用的默认编码格式修改方法 5.QString转std::string的方法 6.总结 1.引言 在编写Qt程序的时候,或多或少都可能遇到用QString时候,明明…

游戏APP如何提高广告变现收益的同时,保证用户留存率?

APP广告变现对接第三方聚合广告平台主要通过SDK文档对接,一些媒体APP不具备专业运营广告变现的对接能力和资源沉淀,导致APP被封控,设置列入黑名单,借助第三方聚合广告平台进行商业化变现是最佳选择。#APP广告变现# 接入第三方平台…

51单片机入门:认识开发板

认识开发板 板载资源: 数码管模块 说明: 2个四位一体共阴数码管 详细: 2个四位一体:两个独立的四位数码管,每个四位数码管都是“一体”的设计,也就是说,每个数码管内部集成了四个独立的七段LE…

Stable Diffusion WebUI 附加功能/图片放大(Extras):单张图片/批量处理/从目录进行批量处理

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 篇文章主要讲解 Stable Diffusion WebUI 的附加功能/图片放大(Extras)的使用,主要…

JAV八股--redis

如何保证Redis和数据库数据一致性 关于异步通知中消息队列和Canal的内容。 redisson实现的分布式锁的主从一致性 明天继续深入看这个系列问题 介绍IO复用模型