# encryption-demo **Repository Path**: ShakeJ/encryption-demo ## Basic Information - **Project Name**: encryption-demo - **Description**: 后端加解密算法库,利用SpringBoot+spring MVC +MyBatis-PLUS 搭建得单体项目 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-14 - **Last Updated**: 2024-03-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 通用密码算法库开发文档 ### 目标 > 1. 实现多种算法的加解密算法; > 2. MySQL数据库进行存储,引入中间件redis进行缓存查询优化; > 3. 对加密插入、数据库查询的性能进行压力测试,得到性能图表进行比较; ​ ### 1. 数据库设计 + 基础元素:明文、密钥(可选)、密文、加密类型; + 三种类型的表:对称和非对称加密,保存密钥的表(用于后续的消息队列存储和分发) + 表中的键值关系 1. 主键应该是对应查询的序列号(采取主键自增,最初从100开始进行累加计数) 2. 属性值包含明文、密文、密钥(可选)、加密类型; + 对应关系:主要是明文-密文-类型的关系;公钥和私钥等利用第三方密码库进行处理、生成,所以就不用存储了; + 这里存在问题:如果是相同的明文进行多种加密方式,那么如何选择合适的进行存储? + 较为便利的方式:对工具库/类的引用 + Redis数据库部分的思考: 1. 采用什么数据结构合适? 2. 在单体项目数据库中对插入、查询的结果进行缓存,这样直接不必重新从redis中进行查询? ​ ### 2. 项目单体架构 #### 1. 用户端(消费者) 1. 输入明文、密钥信息,将该信息序列化之后传入到服务端使用。 #### 2. 服务端(提供者) 1. 获取明文、密钥信息,controller - dao - service 三层基础处理流程,进行加密函数的调用解析,返回加密后的信息数据; 2. 数据库按照类型进行存储,后续将搜索过加解密数据存储到redis当中进行缓存即可(可以设置有效时间,过期垃圾回收等等) ​ #### **密码要求** **AES、ECDSA、 SHA256、SM2、SM3、SM4** + **对称加密算法:AES、SM4;** + **非对称加密算法:ECDSA、SM2;**(这里暂未全部实现) 1. **ECDSA** 当使用ECDSA时,一般涉及到密钥生成、签名和验证三个主要步骤。以下是一个简单的示例说明了ECDSA的用法: 1.1 密钥生成: 首先,需要生成一对公钥和私钥。这对密钥将用于进行数据的签名和验证。 1.2 数据签名: 假设有一段数据需要进行签名,比如一份文档或者一条消息。对这段数据进行签名的过程如下: - 使用私钥对数据进行签名,生成签名值。 1.3 签名验证: 接收方在接收到数据和签名值之后,可以使用公钥来验证签名的有效性。 - 使用公钥和原始数据进行签名验证,验证签名是否合法。 ​ > 部分流程: > > 1. 接收到的数据包括原始数据(message)、签名值(signature)和发送方的公钥(public key)。 > 2. 接收方使用发送方的公钥、原始数据和签名值来验证签名的有效性。 > 3. 接收方对签名值进行解密或者解码,得到一些中间数据。 > 4. 接收方根据ECDSA算法规则对中间数据进行操作,生成一个值。 > 5. 将生成的值与原始数据进行比较: > - 如果两者相匹配,则表示签名有效,数据未被篡改。 > - 如果不匹配,则表示签名无效,数据可能已经被篡改。 > > 总之,接收方使用公钥和签名值进行一系列操作,并将结果与原始数据进行比较,以确认签名的有效性和数据的完整性。这样可以确保数据在传输过程中没有被篡改。 ​ 2. **SM2** SM2是一种非对称加密算法,下面是SM2的加密和解密过程: **SM2加密过程:** 1. 生成密钥对:首先,需要生成一对公钥和私钥。公钥用于加密数据,私钥用于解密数据。 2. 加密数据: - 随机生成一个对称密钥(例如AES密钥)用于对称加密数据。 - 使用公钥对称密钥进行加密,得到密文密钥。 - 使用对称密钥对原始数据进行加密,得到密文数据。 3. 生成密文:将密文密钥和密文数据组合在一起形成最终的密文。 **SM2解密过程:** 1. 使用私钥解密密文密钥,得到对称密钥。 2. 使用对称密钥解密密文数据,得到原始数据。 需要注意的是,SM2算法中的加密和解密涉及到对称加密算法(如AES)来实现数据的加密和解密过程,而非直接使用非对称加密算法进行数据的加密和解密。这种结合对称加密和非对称加密的方式既保证了安全性,又提高了效率。 ​ + **哈希算法:SHA256、SM3;**(可加密,但是不可解密) ​ ### 3. 中间件 #### 1. 消息队列 + 用于存储中间的密钥,可以分配不同的集群模式(后续补充,压测和数据量) #### 2. 缓存(Redis) + 存储序号和类型,通过查询明文得到对应的密文 + 通过redis进行缓存,绑定合适的明文和密钥,返回密文,作为缓存(这个后续再补充也可) + 采取的数据结构是String类型,可以设置expire设置过期、保存时间 ### 4. 压测和性能 + 利用的工具平台是Jmeter,模仿高并发环境; + 这里对多个服务端并发加密、并发查询、以及数据库MySQL和缓存redis的性能进行比较; 1. 1000并发线程对服务端进行加密请求压测: 2. MySQL和redis进行1000线程并发查询3轮的性能: ### 后续可能补充 #### 集群 + 为增强数据查询的健壮性,在数据量够大的情况下,可以利用集群对数据的查询进行分配; + 加解密的类型和测试存储量可能会达到瓶颈;