IM系统服务端消息加解密方案

Stella981
• 阅读 817

IM系统中信息可能涉及隐私或秘密,安全显得尤为重要,怎么确保信息的安全呢?

端到端加密是最安全的,只有聊天双方知道具体是什么消息,传输链路和消息服务器端都不知道消息内容。但是端到端加密在有些场景不适用,比如大规模群聊就不太好办。另外基于某些合规性要求,端到端加密也不合适。

如果不采用端到端加密,消息的加密就分为网咯传输加密和服务端存储加密两部分。

传输过程,tcp长连接可以采用ssl协议(当然也可以自己实现加密《为什么相同的消息微信每次加密后发送的内容都不一样?》),websocket采用wss协议。

难点变成了消息在服务端测的安全问题。消息在服务器端的路由过程怎么加密, 存储怎么加密?

IM系统后台逻辑很复杂,涉及众多模块,中间还有消息总线、缓存、数据库等中间件。每个环节消息都需要以密文形式呈现,否则很容易泄漏。

第一反应是简单写个加密算法如AES对数据进行加密解密就搞定了。但是这样存在一个非常大的隐患。密码怎么保存?

日防夜防,家贼难防。写代码的程序员,部署系统的运维人员都可能拿到密码,如果密码写在配置文件里,会与更多人得到密码,比如能够访问git仓库的人……总之,这种方式非常不安全。

因此,一套完善的加密系统显得尤为重要。

加解密系统结构如下图,主要包括4部分。1、加解密服务,2、加解密管理服务,3、加密服务器,4、秘钥存储库。

IM系统服务端消息加解密方案

1、加解密服务。

以HTTP,TCP等方式对业务系统提供加密、解密、转加密等服务,提供加密服务器的负载均衡能力。同时提供业务系统可以直接使用的SDK。加解密服务以IP白名单+App_Key/App_Secret组合的方式对外提供访问授权,确保只有授权的系统才能访问

2、加解密管理服务。

核心是提供密码生成、管理等服务(密码是以加密后形式展示,只有加密服务器才能解密)。以及一些管理配置等功能

3、加密服务器

提供加密、解密的能力。加密服务器内置多种加密算法,通过超级秘钥(root key),实现对加解密秘钥(business key)的加密解密;通过加解密秘钥(business key)实现业务数据的加解密。超级秘钥(root key)被拆成3部分保存在秘钥卡或U盘中。

4、秘钥存储库

以密文形式存储加密机生成的加解密秘钥(business key),秘钥只有加解密服务器能解密。

整个加密方案涉及几个主要流程

1、加解密服务器初始化(或配置参数)

(1)启动加解密服务器,插入3张秘钥卡(U盘)

(2)加解密服务器已内置的算法(加密芯片)对root key进行加密,缓存到内存,同时保存的机器存储介质。因此,内存及存储上的数据处于密文状态。

(3)根据root key初始化business key加解密服务

(4)初始化业务数据加解密服务

2、生成加解密秘钥(business key)

(1)通过加解密管理服务,为即将生成的秘钥起名(名字及秘钥索引号),向加解密服务器发出生成秘钥的命令。

(2)加解密服务器随机生成business key,通过root key进行加密。把加密后的business key返回,关联秘钥索引号,并保存到秘钥存储库。

3、加密及解密业务数据

(1)业务系统调用加解密服务,传入 秘钥索引号、算法以及业务数据

(2)加解密服务调用加密服务器,传入加密后的business key、算法以及业务数据

(3)加密服务器完成加密,并返回结果

加密系统的核心要点是:业务数据和加密服务隔离,算法和秘钥隔离。

本文分享自微信公众号 - 普通程序员(farmerbrag)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
QQ音乐API分析之
QQ音乐API加密参数分析1、背景2、QQ音乐sign计算3、Java代码实现4、总结1、背景不知道什么时候开始,各家音乐APP都开始对API进行加密,最近一段时间对六大音乐平台的加密算法进行了研究,逆向了网页端、安卓端等等,已经掌握了各家的加密算法。平台加密算法非加密接口专
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
2年前
HTTPS的工作原理
目的http就是我们平时浏览网页时候使用的一种协议(网站是以http://开头)。http协议传输的数据都是未加密的(明文),一次http协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,出现了https,下面讨论一下https的工作原理:概述HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一
Wesley13 Wesley13
2年前
JAVA加解密算法设计与应用
业务场景APP移动端、WEB、桌面端、第三方平台密码等敏感数据加密设计如app端登录密码加密设计对于登录密码不需要进行解密只需要加密算法结合规则进行比较就能得到密码正确与否方法一(签名保证安全)1.密码等敏感信息取Md5值对所有值(加上timestamp)
Stella981 Stella981
2年前
IM消息ID技术专题(六):深度解密滴滴的高性能ID生成器(Tinyid)
1、引言在中大型IM系统中,聊天消息的唯一ID生成策略是个很重要的技术点。不夸张的说,聊天消息ID贯穿了整个聊天生命周期的几乎每一个算法、逻辑和过程,ID生成策略的好坏有可能直接决定系统在某些技术点上的设计难易度。有中小型IM场景下,消息ID可以简单处理,反正只要唯一就行,而中大型场景下,因为要考虑到分布式的性能、一致性等,所以要考虑的问题
Wesley13 Wesley13
2年前
Java使用SSLSocket通信
JSSE(JavaSecuritySocketExtension)是Sun公司为了解决互联网信息安全传输提出的一个解决方案,它实现了SSL和TSL协议,包含了数据加密、服务器验证、消息完整性和客户端验证等技术。通过使用JSSE简洁的API,可以在客户端和服务器端之间通过SSL/TSL协议安全地传输数据。首先,需要将OpenSSL生成根证书CA及签
郑天寿 郑天寿
11个月前
北京融云即时通讯业务如何保证信息安全?
北京融云即时通讯业务采用多种技术手段,确保用户的信息安全。例如,使用端到端加密技术,保证信息传输过程中不会被非法获取或窃取;采用身份验证机制,确保只有授权用户才能访问信息;提供信息保密功能,防止信息被未经授权的第三方查看等。
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
待兔 待兔
3个月前
很多人讲不明白HTTPS,但是我能
很多人讲不明白HTTPS,但是我能今天我们用问答的形式,来彻底弄明白HTTPS的过程下面的问题都是小明和小丽两个人通信为例可以把小明想象成服务端,小丽想象成客户端1.https是做什么用的?答:数据安全传输用的。2.数据如何安全的传输?答:把数据加密以后,