大家好,我是蓝胖子,在之前# 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

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

tls1.3

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

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

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

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

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

im消息加密解决方案

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

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

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

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

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

注意,在im消息系统设计时,对于消息认证我们没有去生成一个数字证书,对于https,客户端对服务端的消息认证却是通过数字证书的认证完成的。

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

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

https安全性 带给im 消息加密的启发的更多相关文章

  1. 浅议NetMQ常见模式和消息加密机制

    浅议NetMQ常见模式和消息加密机制 概述 在传统企业级开发中,消息队列机制已经成为一种非常常见的技术实现手段,而基于NetMQ则看起来有点像一朵"奇葩",看起来从名字似乎是一个消 ...

  2. WCF使用安全证书验证消息加密

    首先安装 服务端安全证书  代码如下:  // 下面第一行是安装证书,第二行是将证书列入信任 makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=lo ...

  3. Solon rpc 之 SocketD 协议 - 消息加密模式

    Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...

  4. 即时通信系统中如何实现:聊天消息加密,让通信更安全? 【低调赠送:QQ高仿版GG 4.5 最新源码】

    加密重要的通信消息,是一个常见的需求.在一些政府部门的即时通信软件中(如税务系统),对聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新的GG 4.5中,增加了对聊天消息 ...

  5. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

    前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

  6. 带密钥的sha1加密

    带密钥的sha1加密: private static string HmacSha1Sign(string jsonStr, string secretKey, string enCoding ) { ...

  7. 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C#开源即时通讯系统(支持广域网)——GGTalk4.5 最新源码】

    在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...

  8. 游戏服务器与客户端交互,或者与跨服交互都有消息加密方式,为什么不明文传递,加md5校验呢

    游戏服务器与客户端交互,或者与跨服交互都有消息加密方式,为什么不明文传递,加md5校验呢

  9. bugzilla4的xmlrpc接口api调用实现分享: xmlrpc + https + cookies + httpclient +bugzilla + java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能

    xmlrpc .  https . cookies . httpclient.bugzilla . java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能,网上针对bugzilla的实现很 ...

  10. 浅谈HTTPS安全性

    各位可曾有过使用智能手机App在网络商店购物的经验,想必是有的,那你/妳会不会担心不够安全呢?有人会说放心吧,购物网站有使用SSL/TLS加密传输,我们就来聊聊HTTPS好了. 客户端与服务器端的交握 ...

随机推荐

  1. vmware之NAT模式配置

    ​ 题外话之前的题外话,本文迁移自别的社区,三年前大学实习时写下本文,过了几年再回过头来看,虽然讲得浅显,作为入门笔记也勉强合格. ---------------------------------- ...

  2. Innodb学习之MySQL体系结构

    目录 数据库和数据库实例 MySQL体系结构 MySQL各存储引擎特性 Innodb存储引擎 MyISAM BDB: Memory Archive Federated 数据库和数据库实例 数据库是所有 ...

  3. win32 - 内存映射(CreateFileMapping)

    目标:创建一个app,使用CreateToolhelp32Snapshot扫描所有的进程,并将进程的pid和exe名字映射到内存中,再在另一个app中使用OpenFileMapping打开该映射读取相 ...

  4. Hi3516开发笔记(八):Hi3516虚拟机交叉开发环境搭建之配置QtCreator开发交叉编译环境

    海思开发专栏 上一篇:<Hi3516开发笔记(七):Hi3516虚拟机交叉开发环境搭建之交叉编译Qt>下一篇:<Hi3516开发笔记(九):在QtCreator开发环境中引入海思sd ...

  5. MIG是如何向DDR中写入数据的

    1.1    先来看看信号线的描述 我们以X16的器件为例,下面的截图来自 镁光的官方手册 https://media-www.micron.com/-/media/client/global/doc ...

  6. 影刀rpa第一个学习项目开发所得

    1.我要在某个位置新增一条指令,但是可能没有选择好的原因,这条指令被添加到指令的最后面了,我的指令行数有几十行,然后我就要把这条指令拖动到上一屏我指定的位置上,但当我拖动指令到了当前屏最上方时,发现编 ...

  7. 16. Class字节码结构

    1. 相关概念 1.1字节码文件的跨平台性 Java 语言是跨平台的(write once, run anywhere) 当 Java 源代码成功编译成字节码后,如果想在不同的平台上面运行, 则无须再 ...

  8. Java 开发人员调度软件项目 (java基础编程总结项目)+javaBean+测试代码+数组知识+数据结构+继承+多态+封装+自定义异常,异常处理+构造器知识+重载+重写+接口+实现接口+关键字使用(static +equalsIgnoreCase+fianl+instanceof判断类型)+向下转型与向上转型

    /** * * @Description Java 开发人员调度软件项目 (java基础编程总结项目) * +javaBean+测试代码+数组知识+数据结构+继承+多态+封装+自定义异常,异常处理 * ...

  9. mysql标识列和事务

    1 #标识列 2 /* 3 又称为自增长列 4 含义:可以不用手动的插入值,系统提供默认的序列值 5 6 7 特点: 8 1.标识列必须和主键搭配吗?不一定,但要求是一个key 9 2.一个表可以有几 ...

  10. python3 Crypto模块实例解析

    一 模块简介 1.简介 python的Crypto模块是安全hash函数(例如SHA256 和RIPEMD160)以及各种主流的加解密算法的((AES, DES, RSA, ElGamal等)的集合. ...