当前位置: 首页 > article >正文

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

全文目录,一步到位

  • 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

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

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

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

2.2 springboot的redis配置类

2.2.1 例如在RedisConfig中

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

  private final Environment environment;

    public RedisConfig(Environment environment) {
        this.environment = environment;
    }

    @Bean
    public 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的序列化与反序列化方式(收录两种)

示例如下:
  	@Bean
    public 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

    	String[] keyPair = ConfigTools.genKeyPair(512);

        //私钥
        String privateKey = keyPair[0];

        //公钥
        String publicKey = keyPair[1];

2.3.2 用私钥加密后的密文

encrypt

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

2.3.2 使用公钥+密文 解密

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

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

2.4.1 使用jar包

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

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

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

2.4.2 druid包如图所示

在这里插入图片描述

3. 文章的总结与预告

3.1 本文总结

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

3.2 下文预告

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



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


http://www.kler.cn/a/281451.html

相关文章:

  • Qt QCustomPlot画色阶图
  • 汇编知识MOV,MRS,MSR,PUSH和POP指令
  • TinaSDKV2.0 自定义系统开发
  • 机器学习概述,深度学习,人工智能,无监督学习,有监督学习,增量学习,预处理,回归问题,分类问题
  • Python数据采集与网络爬虫技术实训室解决方案
  • MHA(mysql高可用架构)
  • 刷题DAY19
  • 存储实验:基于华为存储实现存储双活(HyperMetro特性)
  • 【功能自动化】使用HTMLTestRunner生成测试报告
  • 浅谈【数据结构】链表之单链表
  • 惠海H6900B升压恒流调光IC芯片3.7V7.4V12V升压18V24V36V 48V 植物灯/电解水
  • 利用命令模式实现一个手游后端架构的方法总结
  • EXCEL试题
  • 【unity实战】使用新版输入系统Input System+Rigidbody实现第三人称人物控制器
  • k8s的组件以及安装
  • 百度文心一言API批量多线程【改写伪原创文章软件】-key免费无限写
  • 能大致讲一下Chat GPT的原理吗?
  • Debugging HIP
  • 35岁零基础能转型AI大模型吗?
  • 关闭spirng boot集成springdoc-openapi的接口文档