php网站开发个人简历,国内近期新闻热点大事件,中文域名和网站的关系,长沙网站优化培训前言
先介绍一下对称加密算法#xff0c;在介绍一下加密流程#xff0c;然后是介绍一下查询加密消息的策略。然后结合现有技术架构然后去选型。 决定采用客户端解密。简而言之就是采用对称服务端加密。然后将加密内容存储到消息表的content字段。然后客户拉取content字段 然…前言
先介绍一下对称加密算法在介绍一下加密流程然后是介绍一下查询加密消息的策略。然后结合现有技术架构然后去选型。 决定采用客户端解密。简而言之就是采用对称服务端加密。然后将加密内容存储到消息表的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编码的字符串。
服务端加密客户端和服务端代码
首先我们会在JavaSpring 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-jsimport 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);