【分布式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期】

对称加密算法

对称加密算法是一种加密方法,其中加密和解密使用相同的密钥。这类算法通常比非对称加密算法更快,适用于大量数据的加密。以下是一些常用的对称加密算法:

  1. AES(高级加密标准)
    描述:AES是目前最广泛使用的对称加密算法之一,被认为是非常安全的。它支持128、192和256位的密钥长度。
    应用:文件加密、SSL/TLS中的数据传输加密、无线网络加密等。
  2. DES(数据加密标准)
    描述:DES曾是最流行的对称加密算法,但由于其56位的密钥长度被认为不再安全,现在已经较少使用。
    应用:早期的银行系统和金融交易加密。
  3. 3DES(三重数据加密算法)
    描述:为了增强DES的安全性,3DES被提出,它通过三次连续加密来增加破解的难度。
    应用:金融支付系统、政府通信加密等。

聊天软件采取服务端加密流程

  1. 用户身份验证
    用户登录:用户通过用户名和密码登录聊天应用。应用可能还会采用多因素认证来增强安全性。
    身份验证:服务端验证用户的身份信息。验证成功后,用户才能开始发送和接收消息。
  2. 生成加密密钥
    密钥生成:服务端为每个用户或会话生成一个唯一的加密密钥。这个密钥用于加密和解密用户的消息。
    密钥管理:服务端负责管理所有用户的加密密钥。这包括密钥的存储、更新和废弃。
  3. 消息加密
    加密过程:当用户A发送消息给用户B时,用户A的客户端先将消息发送到服务端。服务端使用用户B的加密密钥对消息进行加密。
    存储加密消息:加密后的消息存储在服务端,直到用户B准备接收它。
  4. 消息传输
    消息传输:当用户B请求消息时,服务端将加密的消息发送给用户B的客户端。
    端到端加密选项:虽然这里讨论的是服务端加密,一些聊天应用还提供端到端加密作为额外的安全措施,其中消息在客户端加密,并且只能由接收方的客户端解密。
  5. 消息解密
    解密过程:用户B的客户端收到加密的消息后,使用相应的解密密钥对消息进行解密,然后展示给用户B。
  6. 密钥更新和废弃
    定期更新:为了保持高安全性,服务端定期更新加密密钥。
    废弃旧密钥:当密钥被更新时,旧密钥被安全地废弃,以防止旧密钥被滥用。

服务端对数据进行加密后查询历史消息改怎么查询

  1. 加密索引
    方法:为加密数据创建索引,在数据加密之前或加密同时,提取关键信息并对这些信息进行加密,然后将加密后的索引存储在数据库中。查询时,对查询关键字进行相同的加密处理,并使用加密后的关键字来搜索加密的索引。
    优点:保持了数据的加密状态,同时实现了加密数据的可查询性。
    缺点:需要谨慎设计索引策略,以避免泄露敏感信息。
  2. 全部解密后查询
    方法:将请求的数据集全部解密,然后在解密后的数据上执行查询操作。
    优点:实现简单,可以直接应用现有的查询逻辑。
    缺点:性能低下,特别是在数据量大时;安全性降低,因为需要在服务端解密大量数据。
  3. 客户端解密后查询
    方法:将加密的历史消息发送到客户端,然后在客户端进行解密和查询。
    优点:服务端不需要处理解密,保持了较高的安全性。
    缺点:增加了客户端的负担,可能影响用户体验;对于大量数据的场景不适用。

服务端加密后消息类型

服务端加密后的消息类型通常不再是原始的字符串(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);

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

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

相关文章

旅游景区公共广播 园区广播 公路服务区广播

旅游景区公共广播 园区广播 公路服务区广播 旅游景区公共广播 旅游景区公共广播(又称背景音乐)简称BGM,它的主要作用是掩盖噪声并创造一种轻松和谐的气氛,是一种创造轻松愉快环境气氛的音乐。掩盖环境噪声,创造与旅游景区相适应的气氛&#…

报错:Nginx 部署后刷新页面 404 问题

文章目录 问题分析解决 问题 在部署完项目后 刷新页面,页面进入了404 分析 加载单页应用后路由改变均由浏览器处理,而刷新时将会请求当前的链接,而Nginx无法找到对应的页面 关键代码try_files,剩下俩如果其他地方配置了则可以省略。 在这…

GPT实战系列-LangChain构建自定义Agent

GPT实战系列-LangChain构建自定义Agent LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT…

ArmSoM Rockchip系列产品 通用教程 之 RTC 使用

1. RTC 简介​ RTC:(Real_Time Clock):实时时钟 HYM8563是一种低功耗实时时钟(RTC)芯片,用于提供精确的时间和日期信息。它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址…

新装 mysql 需注意配置的项

一 时区配置 mysql 安装后默认是使用系统时间,如果是linux系统就要注意系统时区是否配置正确 1 配置centos系统时区 # 查看当前系统时区 timedatectl status# 如果需要更改时区,比如设置为北京时间(中国标准时间) sudo timeda…

柔性数组知识点

什么是柔性数组 什么是柔性数组?柔性数组其实也是动态内存管理部分的内容。这节主要来复习柔性数组的知识点。 当结构体的最后一个成员为数组, 且这个数组的大小未确定时, 我们就称它是柔性数组。 如: struct stu{char name[…

【Python使用】嘿马头条完整开发md笔记第1篇:课程简介,ToutiaoWeb虚拟机使用说明【附代码文档】

嘿马头条项目从到完整开发笔记总结完整教程(附代码资料)主要内容讲述:课程简介,ToutiaoWeb虚拟机使用说明,Pycharm远程开发,产品与开发,数据库1 产品介绍,2 原型图与UI图,3 技术架构,4 开发。OS…

探索大语言模型(LLM):部分数据集介绍

探索大语言模型(LLM)的宝库:精选数据集介绍 在人工智能的黄金时代,大语言模型(LLM)的发展正以惊人的速度推进。它们不仅改变了我们与机器交互的方式,还在持续拓展技术的边界。作为这一进程的核…

STM32第七节:GPIO输入——按键检测(包含带参宏)

目录 前言 STM32第七节:GPIO输入——按键检测(包含带参宏) 带参宏 代码替换展示 定义带参宏 GPIO输入——按键检测 硬件部分 端口输入数据寄存器(GPIOx_IDR) 编写程序 配置以及编写bsp_key文件 main函数编程…

5. git 删除版本标签

要删除本地的 Git 标签,你可以使用 git tag -d 命令,后面跟上你想要删除的标签名。 以下是如何操作的步骤: 1.打开命令行界面(终端或命令提示符)。 2.导航到你的 Git 仓库所在的目录。 3.使用以下命令删除标签&…

SpringBoot(Lombok + Spring Initailizr + yaml)

1.Lombok 1.基本介绍 2.应用实例 1.pom.xml 引入Lombok&#xff0c;使用版本仲裁 <!--导入springboot父工程--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version&g…

arcgis在GIS滑坡易发性分析中的应用技术研究

我国是地质灾害多发国家&#xff0c;地质灾害的发生无论是对于地质环境还是人类生命财产的安全都会带来较大的威胁&#xff0c;因此需要开展地质灾害风险普查。利用遥感&#xff08;RS&#xff09;技术进行地质灾害调查工作具有宏观、快速、准确的特点&#xff0c;能反映出地质…

空调 USACO2021

题目描述&#xff1a; 思路&#xff1a; 此题非常有技巧&#xff0c;我们首先可以先把希望温度和实际温度做差&#xff0c; 问题就转化成&#xff0c;把这个温度差如何去全都变为0&#xff0c;相对应的变成希望温度 也就是 去给温度差数组去做差分&#xff0c;因为&#xff0…

【正则表达式】正则表达式里使用变量

码 const shuai No My Name Is ShuaiGe.match(new RegExp(shuai, gi)); //↑↑↑↑↑↑↑↑ //等同于 //↓↓↓↓↓↓↓↓ /No/.test(My Name Is ShuaiGe)用作领域 搜索的字符动态改变&#xff0c;例如↓模糊搜索例&#xff1a; 一个文本宽&#xff0c;输入文本模糊搜索用户…

SpringCloud Gateway 新一代网关

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第六篇&#xff0c;即介绍 Gateway 新一代网关。 二、概述 2.1 Gateway 是什么 Gateway 是在 Spring 生…

基于SSM的协同过滤算法的电影推荐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的协同过滤算法的电影推荐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextArea)

多行文本输入框组件&#xff0c;当输入的文本内容超过组件宽度时会自动换行显示。 高度未设置时&#xff0c;组件无默认高度&#xff0c;自适应内容高度。宽度未设置时&#xff0c;默认撑满最大宽度。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&…

Elastic random_score的使用

random_score的使用 在Elasticsearch中&#xff0c;random_score查询可以用来随机排序搜索结果&#xff0c;这对于实现诸如轮播、随机推荐等功能非常有用。 random_score的语法 GET /<索引名>/_search {"query": {"function_score": {"query…

【Docker】APISIX Ingress Controller部署

APISIX Ingress Controller环境标准软件基于Bitnami apisix-ingress-controller:构建。当前版本为1.8.0 你可以通过轻云UC部署工具直接安装部署&#xff0c;也可以手动按如下文档操作&#xff0c;该项目已经全面开源&#xff0c;可以从如下环境获取 配置文件地址: https://git…

前端面试 ===> 【Vue2】

Vue2 相关面试题总结 1. 谈谈对Vue的理解 Vue是一种用于构建用户页面的渐进式JavaScript框架&#xff0c;也是一个创建SPA单页面应用的Web应用框架&#xff0c;Vue的核心是 数据驱动试图&#xff0c;通过组件内特定的方法实现视图和模型的交互&#xff1b;特性&#xff1a;&a…