【分布式websocket】聊天系统消息加密如何做
前言
先介绍一下对称加密算法,在介绍一下加密流程,然后是介绍一下查询加密消息的策略。然后结合现有技术架构然后去选型。
决定采用客户端解密。简而言之就是采用对称服务端加密。然后将加密内容存储到消息表的content字段。然后客户拉取content字段 然后解密。拉取到消息解密后进行展示。客户存储的时候进行加密。
目前已经写的文章有。并且有对应视频版本。
git项目地址 【IM即时通信系统(企聊聊)】点击可跳转
sprinboot单体项目升级成springcloud项目 【第一期】
前端项目技术选型以及页面展示【第二期】
分布式权限 shiro + jwt + redis【第三期】
给为服务添加运维模块 统一管理【第四期】
微服务数据库模块【第五期】
netty与mq在项目中的使用(第六期(废弃))】
分布式websocket即时通信(IM)系统构建指南【第七期】
分布式websocket即时通信(IM)系统保证消息可靠性【第八期】
分布式websocket IM聊天系统相关问题问答【第九期】
什么?websocket也有权限!这个应该怎么做?【第十期】
分布式ID是什么,以美团Leaf为例改造融入自己项目【第十一期】
IM聊天系统为什么需要做消息幂等?如何使用Redis以及Lua脚本做消息幂等【第12期】
微信发送一条消息经历哪些过程。企业微信以及钉钉的IM架构对比【第13期】
微信群为什么上限是500人,IM设计系统中的群聊的设计难点【第14期】
【分布式websocket】RocketMQ发送消息保证消息最终一致性需要做哪些处理?【第15期】
对称加密算法
对称加密算法是一种加密方法,其中加密和解密使用相同的密钥。这类算法通常比非对称加密算法更快,适用于大量数据的加密。以下是一些常用的对称加密算法:
- AES(高级加密标准)
描述:AES是目前最广泛使用的对称加密算法之一,被认为是非常安全的。它支持128、192和256位的密钥长度。
应用:文件加密、SSL/TLS中的数据传输加密、无线网络加密等。 - DES(数据加密标准)
描述:DES曾是最流行的对称加密算法,但由于其56位的密钥长度被认为不再安全,现在已经较少使用。
应用:早期的银行系统和金融交易加密。 - 3DES(三重数据加密算法)
描述:为了增强DES的安全性,3DES被提出,它通过三次连续加密来增加破解的难度。
应用:金融支付系统、政府通信加密等。
聊天软件采取服务端加密流程
- 用户身份验证
用户登录:用户通过用户名和密码登录聊天应用。应用可能还会采用多因素认证来增强安全性。
身份验证:服务端验证用户的身份信息。验证成功后,用户才能开始发送和接收消息。 - 生成加密密钥
密钥生成:服务端为每个用户或会话生成一个唯一的加密密钥。这个密钥用于加密和解密用户的消息。
密钥管理:服务端负责管理所有用户的加密密钥。这包括密钥的存储、更新和废弃。 - 消息加密
加密过程:当用户A发送消息给用户B时,用户A的客户端先将消息发送到服务端。服务端使用用户B的加密密钥对消息进行加密。
存储加密消息:加密后的消息存储在服务端,直到用户B准备接收它。 - 消息传输
消息传输:当用户B请求消息时,服务端将加密的消息发送给用户B的客户端。
端到端加密选项:虽然这里讨论的是服务端加密,一些聊天应用还提供端到端加密作为额外的安全措施,其中消息在客户端加密,并且只能由接收方的客户端解密。 - 消息解密
解密过程:用户B的客户端收到加密的消息后,使用相应的解密密钥对消息进行解密,然后展示给用户B。 - 密钥更新和废弃
定期更新:为了保持高安全性,服务端定期更新加密密钥。
废弃旧密钥:当密钥被更新时,旧密钥被安全地废弃,以防止旧密钥被滥用。
服务端对数据进行加密后查询历史消息改怎么查询
- 加密索引
方法:为加密数据创建索引,在数据加密之前或加密同时,提取关键信息并对这些信息进行加密,然后将加密后的索引存储在数据库中。查询时,对查询关键字进行相同的加密处理,并使用加密后的关键字来搜索加密的索引。
优点:保持了数据的加密状态,同时实现了加密数据的可查询性。
缺点:需要谨慎设计索引策略,以避免泄露敏感信息。 - 全部解密后查询
方法:将请求的数据集全部解密,然后在解密后的数据上执行查询操作。
优点:实现简单,可以直接应用现有的查询逻辑。
缺点:性能低下,特别是在数据量大时;安全性降低,因为需要在服务端解密大量数据。 - 客户端解密后查询
方法:将加密的历史消息发送到客户端,然后在客户端进行解密和查询。
优点:服务端不需要处理解密,保持了较高的安全性。
缺点:增加了客户端的负担,可能影响用户体验;对于大量数据的场景不适用。
服务端加密后消息类型
服务端加密后的消息类型通常不再是原始的字符串(string)类型,而是转换成了字节序列(byte array)。加密过程通常涉及将明文字符串转换为字节,然后使用加密算法对这些字节进行加密,最终生成的加密数据是一个字节序列。
在实际应用中,为了便于存储或传输,加密后的字节序列常常会被编码为字符串。最常用的编码方式包括Base64编码,这种编码方式可以将二进制的字节序列转换为ASCII字符串,便于在网络中传输或在文本系统中存储。
示例
假设服务端使用AES加密算法对一个消息进行加密:
加密前:原始消息是一个字符串(string),例如:“Hello, world!”。
加密过程:
首先,将字符串转换为字节序列。
使用AES加密算法对字节序列进行加密,得到加密后的字节序列。
加密后:直接得到的加密结果是字节序列(byte array)。为了便于处理,这个字节序列通常会被转换为Base64编码的字符串。
服务端加密客户端和服务端代码
首先,我们会在Java(Spring Boot后端)中实现加密和解密流程,然后提供一个简化的JavaScript示例来展示如何在前端进行解密和解码。
Java后端加密和Base64编码
假设我们使用AES加密,并且使用Base64进行编码。
AES加密后是字节流,然后需要字符串,所以使用Base64再次进行加密.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;public class AesEncryptionExample {public static void main(String[] args) throws Exception {// 生成AES密钥KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128); // 可以是128, 192或256SecretKey secretKey = keyGenerator.generateKey();byte[] keyBytes = secretKey.getEncoded();// 初始化Cipher对象用于加密Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, "AES"));// 加密数据String originalText = "Hello, world!";byte[] encryptedBytes = cipher.doFinal(originalText.getBytes());// 使用Base64编码加密后的数据String encodedString = Base64.getEncoder().encodeToString(encryptedBytes);System.out.println("加密并编码后的字符串: " + encodedString);// 解密过程// 使用Base64解码byte[] decodedBytes = Base64.getDecoder().decode(encodedString);// 初始化Cipher对象用于解密cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, "AES"));// 解密数据byte[] decryptedBytes = cipher.doFinal(decodedBytes);String decryptedText = new String(decryptedBytes);System.out.println("解密后的字符串: " + decryptedText);}
}
JavaScript前端解密和解码
假设你已经有了由后端提供的加密并编码后的字符串和密钥(在实际应用中,密钥的传输需要安全处理,这里简化处理),下面是如何在前端使用crypto-js进行解密和解码的示例。
首先,确保安装了crypto-js:
npm install crypto-js
import CryptoJS from 'crypto-js';// 假设这是从后端接收到的加密并编码后的字符串
const encodedString = '...'; // 使用上面Java代码生成的字符串
// 假设这是共享的密钥(实际应用中需要安全地处理密钥)
const key = '...'; // 使用上面Java代码中的密钥(需要转换为适合前端使用的格式)// 使用Base64解码
const decryptedBytes = CryptoJS.AES.decrypt(encodedString, key);
const decryptedText = decryptedBytes.toString(CryptoJS.enc.Utf8);console.log("解密后的字符串: " + decryptedText);
相关文章:
【分布式websocket】聊天系统消息加密如何做
前言 先介绍一下对称加密算法,在介绍一下加密流程,然后是介绍一下查询加密消息的策略。然后结合现有技术架构然后去选型。 决定采用客户端解密。简而言之就是采用对称服务端加密。然后将加密内容存储到消息表的content字段。然后客户拉取content字段 然…...

网络建设与运维培训介绍和能力介绍
1.开过的发票 3.培训获奖的证书 4合同签署 5.实训设备...
3 种方法限制 K8s Pod 磁盘容量使用
容器在运行期间会产生临时文件、日志。如果没有任何配额机制,则某些容器可能很快将磁盘写满,影响宿主机内核和所有应用。 容器的临时存储,例如 emptyDir,位于目录/var/lib/kubelet/pods 下: /var/lib/kubelet/pods/ …...

05-ESP32-S3-IDF USART
ESP32-S3 IDF USART详解 USART简介 USART是一种串行通信协议,广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式,因此它可以在没有时钟信号的情况下(异步模式)或有时钟信号的情况下(同步模式ÿ…...
安塔利斯升级php8
1、includes/classes/class.Database.php 255行 multi_query方法加返回类型 :bool query方法加返回类型:: mysqli_result|bool 2、includes/classes/class.Session.php on line 91 Optional parameter $planetID declared before required parameter $dpath is…...

Clickhouse MergeTree 原理(一)
作者:俊达 MergeTree是Clickhouse里最核心的存储引擎。Clickhouse里有一系列以MergeTree为基础的引擎(见下图),理解了基础MergeTree,就能理解整个系列的MergeTree引擎的核心原理。 本文对MergeTree的基本原理进行介绍…...

【C语言】字符串函数上
👑个人主页:啊Q闻 🎇收录专栏:《C语言》 🎉道阻且长,行则将至 前言 这篇博客是字符串函数上篇,主要是关于长度不受限制的字符串函数(strlen,strcpy,strcat,strcm…...

Java集合基础知识总结(绝对经典)
List接口继承了Collection接口,定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。 实际上有两种list:一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的L…...

Linux:导出环境变量命令export
相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量,或将一个普通变量导出为环境变量,并且在这个过程中,可以给该环境变量赋值。 下面…...

案例--某站视频爬取
众所周知,某站的视频是: 由视频和音频分开的。 所以我们进行获取,需要分别获得它的音频和视频数据,然后进行音视频合并。 这么多年了,某站还是老样子,只要加个防盗链就能绕过。(防止403…...

清华把大模型用于城市规划,回龙观和大红门地区成研究对象
引言:参与式城市规划的新篇章 随着城市化的不断推进,传统的城市规划方法面临着越来越多的挑战。这些方法往往需要大量的时间和人力,且严重依赖于经验丰富的城市规划师。为了应对这些挑战,参与式城市规划应运而生,它强…...

Vue+SpringBoot打造创意工坊双创管理系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…...

Web框架开发-Django简介
一、MVC和MTV模型 MVC 所谓MVC就是把web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的,松耦合的方式连接在一起,模型负责业务对象与数据库…...

VB播放器(动态服务器获取歌词)-183-(代码+说明)
转载地址: http://www.3q2008.com/soft/search.asp?keyword183 VBASP vb动态从服务器读取歌词 VB asp交互 程序, 模式不一样, 与普通的MP3播放器不一样, 这个是可以实现歌词从服务器上查询功能的. 看好了在咨询 我可以給您演示 目 录 前 言 1 1 . 简述 2 1.1 开发…...

java-可变参数
可变参数是什么? 可变参数就是指传入的参数个数是可变的,不是固定的 为什么要可变参数? 当我们要传入大量的形参时,我们就可以用到可变参数了 定义格式 数据类型...变量名; 例如int ...a; 可变参数的细节: &…...

嵌入式学习day37 数据结构
1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…...
嵌入式学习39-程序创建数据库及查找
1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开 数据库文件(创建一个数据库连接) 参数: filename: …...

科研三维模型高精度三维扫描服务3d逆向测绘建模工业产品抄数设计
三维抄数技术在科研三维模型的应用已经日益广泛,其高精度、高效率的特点使得科研工作者能够更快速、更准确地获取和分析数据。这一技术的核心在于通过专业的三维扫描仪对实物进行高精度测量,再将这些数据转化为三维数字模型,为后续的研究提供…...

【LeetCode热题100】141. 环形链表(链表)
一.题目要求 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…...

express+mysql+vue,从零搭建一个商城管理系统11--使用Sequelize
提示:学习express,搭建管理系统 文章目录 前言一、安装sequelize和mysql2二、修改config/db.js三、修改models/user.js,models/shop.js,models/goods.js四、新建dao/user.js,dao/shop.js,dao/goods.js五、修…...
模板方法模式:优雅封装不变,灵活扩展可变
引言:代码复用与扩展的艺术 在日常开发中,我们常遇到核心流程固定但某些步骤需差异化的场景。例如: 数据库操作的通用流程(连接→执行→关闭)HTTP请求的固定步骤(构建请求→发送→解析响应)报表生成的骨架(数据获取→格式转换→输出)模板方法模式正是为解决这类问题而…...

基于LLaMA-Factory和Easy Dataset的Qwen3微调实战:从数据准备到LoRA微调推理评估的全流程指南
随着开源大模型如 LLaMA、Qwen 和 Baichuan 的广泛应用,其基于通用数据的训练方式在特定下游任务和垂直领域中的表现仍存在提升空间,因此衍生出针对具体场景的微调训练需求。这些训练涵盖预训练(PT)、指令微调(SFT&…...
uniapp 集成腾讯云 IM 消息搜索功能
UniApp 集成腾讯云 IM 消息搜索功能实战指南 一、功能实现原理 腾讯云 IM 通过 消息漫游 服务端搜索接口 实现消息检索,核心机制如下: 数据存储:消息默认存储7天(可扩展至30天)索引构建:基于消息内容自…...
神经网络-Day46
目录 一、 什么是注意力二、 特征图的提取2.1 简单CNN的训练2.2 特征图可视化 三、通道注意力3.1 通道注意力的定义3.2 模型的重新定义(通道注意力的插入) 一、 什么是注意力 注意力机制,本质从onehot-elmo-selfattention-encoder-bert这就是…...
hbase资源和数据权限控制
hbase适合大数据量下点查 https://zhuanlan.zhihu.com/p/471133280 HBase支持对User、NameSpace和Table进行请求数和流量配额限制,限制频率可以按sec、min、hour、day 对于请求大小限制示例(5K/sec,10M/min等),请求大小限制单位如…...

一文速通Python并行计算:12 Python多进程编程-进程池Pool
一文速通 Python 并行计算:12 Python 多进程编程-进程池 Pool 摘要: 在Python多进程编程中,Pool类用于创建进程池,可并行执行多个任务。通过map、apply等方法,将函数和参数分发到子进程,提高CPU利用率&…...

贪心算法应用:装箱问题(FFD问题)详解
贪心算法应用:装箱问题(FFD问题)详解 1. 装箱问题概述 装箱问题(Bin Packing Problem)是计算机科学和运筹学中的一个经典组合优化问题。问题的描述如下: 给定一组物品,每个物品有一定的体积,以及若干容量相同的箱子,…...

【python深度学习】Day 45 Tensorboard使用介绍
知识点: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策略下,用tensorboard监…...

计算机网络安全问答数据集(1788条) ,AI智能体知识库收集! AI大模型训练数据!
继续收集数据集,话不多说,见下文! 今天分享一个计算机网络安全问答数据集(1788条),适用于AI大模型训练、智能体知识库构建、安全教育系统开发等多种场景! 一、数据特点 结构清晰:共计1788条&…...
Android 轻松实现 增强版灵活的 滑动式表格视图
表格视图组件,支持: 1. 无标题模式:只有数据行也可以正常滑动 2. 两种滑动模式:固定第一列 或 全部滑动 3. 全面的样式自定义能力 4. 智能列宽计算 1. 无标题模式支持 设置无标题:调用 setHeaderData(null) 或 …...