RSA非对称性加密02: 加密redis的连接密码(下)-私钥加密,公钥解密

news/2024/10/10 14:24:58/

全文目录,一步到位

  • 1.前言简介
    • 1.1 专栏传送门
      • 1.1.2 上文传送门
  • 2. 使用方式
    • 2.1 使用druid自带的RSA加密工具
      • 2.1.1 引入druid依赖
      • 2.1.2 原yml配置(对比使用)
      • 2.1.2 新yml配置
    • 2.2 springboot的redis配置类
      • 2.2.1 例如在RedisConfig中
      • 2.2.2 设置序列化与反序列化代码
        • 示例如下:
    • 2.3 如何加密与解密 `(方法一)`
      • 2.3.1 生成公钥和私钥
      • 2.3.2 用私钥加密后的密文
      • 2.3.2 使用公钥+密文 解密
    • 2.4 如何加密与解密 `(方法二)`
      • 2.4.1 使用jar包
      • 2.4.2 druid包如图所示
  • 3. 文章的总结与预告
    • 3.1 本文总结
    • 3.2 下文预告


1.前言简介

单体项目中 账号密码会存在yml中 明文显示
例如mysql和redis
下面做redis的加密与解密方式 使用RSA
本篇不对RSA进行解释 详细请看上篇

1.1 专栏传送门

传送门: => 数据安全等功能

1.1.2 上文传送门

传送门: => AES对称性加密
传送门: => RSA非对称性加密01: 加密mysql的连接密码

2. 使用方式

使用druid的包进行加密解密
正好数据库连接池也是用druid

druidRSA_16">2.1 使用druid自带的RSA加密工具

这里的RSA加密是 私钥加密 公钥解密

druid_18">2.1.1 引入druid依赖

版本是: <druid.version>1.2.20</druid.version>

   <!-- 阿里数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency>

2.1.2 原yml配置(对比使用)

填写redis的ip和密码

spring: # redis 配置redis:# 地址host: 192.168.1.29# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码(没有就是空)password: 123456# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 2# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms

2.1.2 新yml配置

增加公钥和加密后的密码

spring: # redis 配置redis:# 地址host: 192.168.1.29# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码(没有就是空)password: KsqtvETTXHr7g4/q6IXbv+hV5m0qjRs6Wwh7G02oME4n3FTqel7i3LC21ucgbG6Tkb+5A4a7i389czFAdA10aw==#公钥(RSA加密) 没有就是空)publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAK5K0z+lnnDyrCB6xTTx9ltRoi8lrTuHoStsLZzyMsmtEn0h9TwmZ+aPHlQQMrfRKgoSdyCBTKA57b4KzpNIJysCAwEAAQ==# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 2# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms

redis_84">2.2 springboot的redis配置类

2.2.1 例如在RedisConfig中

(配置序列化与反序列化位置相同的地方 增加以下代码)

java">  private final Environment environment;public RedisConfig(Environment environment) {this.environment = environment;}@Beanpublic RedisConnectionFactory myLettuceConnectionFactory() throws Exception {RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(Objects.requireNonNull(environment.getProperty("spring.redis.host")), Integer.parseInt(Objects.requireNonNull(environment.getProperty("spring.redis.port"))));redisStandaloneConfiguration.setDatabase(Integer.parseInt(Objects.requireNonNull(environment.getProperty("spring.redis.database"))));//获取application.yml 中的密码(密文)String publicPassword = environment.getProperty("spring.redis.password");String publicKey = environment.getProperty("spring.redis.publicKey");if (StringUtils.isNotBlank(publicPassword) && StringUtils.isNotBlank(publicKey)) {String realPassword = ConfigTools.decrypt(publicKey, publicPassword);//解密密码并set到配置中redisStandaloneConfiguration.setPassword(realPassword);}return new LettuceConnectionFactory(redisStandaloneConfiguration);}

2.2.2 设置序列化与反序列化代码

传送门: => 配置redis的序列化与反序列化方式(收录两种)

示例如下:
java">  	@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;}

2.3 如何加密与解密 (方法一)

2.3.1 生成公钥和私钥

genKeyPair

java">    	String[] keyPair = ConfigTools.genKeyPair(512);//私钥String privateKey = keyPair[0];//公钥String publicKey = keyPair[1];

2.3.2 用私钥加密后的密文

encrypt

java">String password = ConfigTools.encrypt(privateKey, password);
System.out.println("privateKey:" + privateKey);
System.out.println("publicKey:" + publicKey);
System.out.println("password:" + password);

2.3.2 使用公钥+密文 解密

java">String decryptPassword = ConfigTools.decrypt(publicKey, password);
System.out.println("解密后:" + decryptPassword);

2.4 如何加密与解密 (方法二)

2.4.1 使用jar包

进入maven的仓库, druid包下 运行java指令
最后 加 > pzy.txt 表示输出到 pzy.txt文档中

java">java -cp druid-1.2.20.jar com.alibaba.druid.filter.config.ConfigTools 密码

如图所示
在这里插入图片描述

druid_172">2.4.2 druid包如图所示

在这里插入图片描述

3. 文章的总结与预告

3.1 本文总结

  • redis密码使用RAS进行加密解密
  • 密码如果是空 则yml对应位置不填即可 代码内判断空的情况了

3.2 下文预告

使用druid对数据库密码进行加密解密, 以及druid的部分配置解释



@author: pingzhuyan
@description: ok
@year: 2024


http://www.ppmy.cn/news/1517548.html

相关文章

使用C++封装顺序表

作业&#xff1a;使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 #include <iostream>using namespace std;using datatypeint; #define MAX 20struct SeqList { private: //私有datatype *data;int size0; …

期权定价模型(如Black-Scholes模型)和利率模型中的单因子模型的Python实现案例

一&#xff1a;期权定价模型&#xff08;如Black-Scholes模型&#xff09;的实现 期权定价模型&#xff08;如Black-Scholes模型&#xff09;是用来确定期权合理价格的数学模型。这些模型基于一定的假设&#xff0c;考虑了多种因素&#xff0c;如标的资产价格、期权的行权价格…

Java 入门指南:Java IO 设计模式

Java 设计模式是一组被广泛应用于Java程序设计中的解决常见问题的可复用设计方案。这些设计模式通过提供一套经过验证的面向对象的设计原则和思想&#xff0c;可以帮助开发人员更好地组织和设计他们的代码。 在Java IO 中&#xff0c;并没有像创建型、结构型和行为型等常见的设…

前端面试题-Vite的打包速度为什么比Webpack快?

哈喽小伙伴们大家好!今天继续为大家分享一道面试题 大家都知道,Vite和Webpack是前端开发中用来构建项目的两个框架,Webpack是针对Vue2的,而Vite则是为vue3量身定制的,他们有哪些区别呢?为什么我们推荐使用Vite呢?Webpack又有哪些缺点呢?这篇文章我们来一探究竟。 Vite和We…

[翻译+笔记] Score-based generation: 通过数据分布的梯度进行生成建模

本次翻译笔记的是Yang Song博士的博客https://yang-song.net/blog/2021/score/. Yang Song博士提出了一系列的score-based的生成模型, 并对后续Diffusion model也产生了很深远的影响. 1. 引言 生成的基本任务是从某种程度上来估计或采样原始的数据分布. 现有的估计分布的方法大…

《中小学班主任》是什么级别的刊物?核心期刊吗?

《中小学班主任》是什么级别的刊物&#xff1f;核心期刊吗&#xff1f; 《中小学班主任》不是核心期刊&#xff0c;而是一本教育类省级刊物。 该刊旨在为全国中小学班主任提供学术指导&#xff0c;促进专业发展服务&#xff0c;是全国一线班主任和班主任研究者展示专业智慧和…

什么牌子的充电宝质量好?四款口碑极佳充电宝机型大盘点

在快节奏的现代生活中&#xff0c;充电宝已然成为我们不可或缺的随身物品。无论是日常通勤、外出旅行还是学习办公&#xff0c;一个质量上乘的充电宝能为我们的电子设备提供稳定可靠的电力支持。然而&#xff0c;面对市场上众多的充电宝品牌和机型&#xff0c;究竟什么牌子的充…

UE5学习笔记16-游戏模式中的一些事件,如何改变网格体和摄像头的碰撞

一、OnPostLogIn&#xff1a;此事件在玩家成功登录游戏后被调用 二、HandleStartingNuwplayer&#xff1a;在OnPostLogIn事件后被调用&#xff0c;可以用来定义新进入的玩家会发生什么 三、Spawn Default PawnAtTransform&#xff1a;这个事件触发游戏中实际的Pawn生成 四、…