你的配置文件还没加密嘛~

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 你的配置文件还没加密嘛~

配置文件加密

配置文件很多时候我们使用明文的方式,例如Mysql、redis等等,会给我们的服务运行环境带来一些网络攻击风险。

配置文件加密功能显得尤为重要。


方案一、druid(加密账号、密码)

可以通过配置filter配置config实现数据源密码加密

缺点:只能修改密码

方案二、修改hosts文件(加密 IP,port)


我们使用的redis、mysql通常是需要一个ip地址的,
如何隐藏我们的ip,哪怕拿到我们的账号密码,也是没有办法的。

缺点:要维护好hosts文件

方案三、使用内网环境访问


所有的服务使用内网访问模式,除非这台链接外网的服务器被攻破

缺点:本地访问生产服务不方便

方案四、jasypt(强力推荐)

    方案一:
    引入pom 
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.4</version>
    </dependency>
    
    开启 @EnableAutoConfiguration注解
    
    方案二:
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot</artifactId>
        <version>3.0.4</version>
    </dependency>
    
    不需要开启 @EnableAutoConfiguration注解




package com.manlitech.cloudboot.basebootconfig.util;

/**
 * jasypt 加密工具类
 * @author shensg
 * @date 2022/1/26 9:54
 */
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.PBEConfig;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.jasypt.util.text.BasicTextEncryptor;
public class JasyptUtils {
    /**
     * {@link StringEncryptor} 加解密。
     * 同一个密钥(secretKey)对同一个内容执行加密,生成的密文都是不一样的,但是根据根据这些密文解密成明文都是可以.
     * 1、Jasypt 默认使用 {@link StringEncryptor} 来解密全局配置文件中的属性,所以提供密文时,也需要提供 {@link StringEncryptor} 加密的密文
     * 2、{@link StringEncryptor} 接口有很多的实现类,比如常用的 {@link PooledPBEStringEncryptor}
     * 3、setConfig(final PBEConfig config):为对象设置 {@link PBEConfig} 配置对象
     * 4、encrypt(final String message):加密内容
     * 5、decrypt(final String encryptedMessage):解密内容
     *
     * @param secretKey :密钥。加/解密必须使用同一个密钥
     * @param message   :加/解密的内容
     * @param isEncrypt :true 表示加密、false 表示解密
     * @return
     */
    public static String stringEncryptor(String secretKey, String message, boolean isEncrypt) {
        PooledPBEStringEncryptor pooledPBEStringEncryptor = new PooledPBEStringEncryptor();
        pooledPBEStringEncryptor.setConfig(getSimpleStringPBEConfig(secretKey));
        String result = isEncrypt ? pooledPBEStringEncryptor.encrypt(message) : pooledPBEStringEncryptor.decrypt(message);
        return result;
    }
    /**
     * 设置 {@link PBEConfig} 配置对象,SimpleStringPBEConfig 是它的实现类
     * 1、所有的配置项建议与全局配置文件中的配置项保持一致,特别是 password、algorithm 等等选项,如果不一致,则应用启动时解密失败而报错.
     * 2、setPassword(final String password):设置加密密钥,必须与全局配置文件中配置的保存一致,否则应用启动时会解密失败而报错.
     * 3、setPoolSize(final String poolSize):设置要创建的加密程序池的大小.
     * 4、setAlgorithm(final String algorithm): 设置加密算法的值, 此算法必须由 JCE 提供程序支持
     * 5、setKeyObtentionIterations: 设置应用于获取加密密钥的哈希迭代次数。
     * 6、setProviderName(final String providerName):设置要请求加密算法的安全提供程序的名称
     * 7、setSaltGeneratorClassName:设置 Sal 发生器
     * 8、setIvGeneratorClassName:设置 IV 发生器
     * 9、setStringOutputType:设置字符串输出的编码形式。可用的编码类型有 base64、hexadecimal
     *
     * @param secretKey
     * @return
     */
    private static SimpleStringPBEConfig getSimpleStringPBEConfig(String secretKey) {
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(secretKey);
        config.setPoolSize("1");
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        return config;
    }

    public static void main(String[] args) throws Exception {
        String message = "12345";
        String password = "987654321";

        //一个同样的密码和秘钥,每次执行加密,密文都是不一样的。但是解密是没问题的。
        String jasyptEncrypt = stringEncryptor(password, message, true);
        System.out.println(jasyptEncrypt);

        String jasyptEncrypt1 = stringEncryptor(password, "/96O8POEpW1rsIQhVowGmCzJPLEig8SVpwzBk8l+zEo=", false);
        System.out.println(jasyptEncrypt1);
    }
}

使用配置

配置案例ENC(*)

datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&failOverReadOnly=false
          username: root
          password: ENC(lltMufyygkH7CtaNUDObht2PYQHsBKNnLxFfkfSGN3g=)

更多实践操作参考

https://github.com/ulisesbocchio/jasypt-spring-boot

http://www.jasypt.org/

解锁更多自定义的配置


微信公众号,需要的话就关注下我~

目录
相关文章
|
存储 算法 安全
Golang 实现对配置文件加密
Golang 实现对配置文件加密
|
7月前
|
Java 数据库 Maven
Jasypt 配置文件加密的用法
Jasypt 配置文件加密的用法
370 0
|
7月前
|
安全 Java 测试技术
SpringBoot配置文件中的数据加密
SpringBoot配置文件中的数据加密
42 0
|
存储 算法 Java
【Jasypt】Spring Boot 配置文件加解密 Jasypt 配置文件加密
【Jasypt】Spring Boot 配置文件加解密 Jasypt 配置文件加密
568 0
|
Java 数据安全/隐私保护
SpringBoot使用jasypt进行配置文件加密
SpringBoot使用jasypt进行配置文件加密
757 1
|
安全 Java 测试技术
SpringBoot配置文件数据加密自定义开发详解
本章将对SpringBoot配置文件中的数据加密做自定义开发. 在SpringBoot开发过程中配置文件是明文存放在application.yml或者application.properties文件中,这种配置方式会带来一定的安全隐患,本章将对这个问题提出一个简单的解决方案。
|
存储 算法 Java
Nacos 中的配置文件如何实现加密传输
Nacos 中的配置文件如何实现加密传输
1117 0
Nacos 中的配置文件如何实现加密传输
|
XML 安全 Java
jasypt与Spring结合使用解决配置文件中数据库密码加密问题
jasypt与Spring结合使用解决配置文件中数据库密码加密问题
681 0
jasypt与Spring结合使用解决配置文件中数据库密码加密问题
|
缓存 Java 数据库
SpringBoot配置文件加密
配置文件加密这个很重要,但是却往往被很多初学者忽视,必要的参数加密是很重要的。
173 0
|
运维 NoSQL 小程序
SpringBoot配置文件加密jasypt【数据库配置加密、redis配置加密、核心参数加密】
SpringBoot配置文件加密jasypt【数据库配置加密、redis配置加密、核心参数加密】
382 0