SpringBoot项目使用Jasypt加密库给数据库加密

需求说明

项目中会有使用配置文件来存放敏感信息(比如数据库密码、redis等),但生产环境中如果采用明文配置将会有安全问题。为了消除安全隐患,最直接的方式就是把明文敏感信息加密,解密。Jasypt 框架提供了很好的解决方案。

Jasypt 简介

Jasypt 是一个Java库,Java加密包,用于加密和解密敏感数据,它允许开发人员以很简单的方式添加基本加密功能,且无需深入研究加密原理。

Jasypt的功能特性

  • 安全性高
  • 线程安全
  • 配置性能高
  • 跨语言平台等
  • 详细介绍请见Jasypt官网

在SpringBoot项目中如何使用Jasypt

  1. 添加Jasypt依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.3</version>
    </dependency>
  2. yml配置文件

    1
    2
    3
    jasypt:
    encryptor:
    bean: fu99999EncryptorBean
  3. 配置文件中是以bean的方式注入,在启动类中添加jasyptbean给数据库进行加密

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @Bean(name = "fu99999EncryptorBean")
    static public StringEncryptor stringEncryptor() {
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    SimpleStringPBEConfig config = new SimpleStringPBEConfig();
    config.setPassword("windOfGrace");// 加密的密钥,随便自己填写
    config.setAlgorithm("PBEWithMD5AndDES");// 加密的算法,这个算法是默认的
    config.setKeyObtentionIterations("1000");
    config.setPoolSize("1");
    config.setProviderName("SunJCE");
    config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
    config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
    config.setStringOutputType("base64");
    encryptor.setConfig(config);
    return encryptor;
    }
  4. 写一个工具类或者写个main方法执行下需要加密的数据库地址

    1
    2
    3
    4
    5
    public static void main(String[] args) {
    System.out.println(stringEncryptor().encrypt("jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8"));
    System.out.println(stringEncryptor().encrypt("root"));
    System.out.println(stringEncryptor().encrypt("123456"));
    }
  5. 把加密之后的秘钥配置到数据库地址中,注意格式ENC(秘钥)

    1
    2
    3
    4
    5
    6
    7
    spring:
    jackson:
    time-zone: GMT+8
    datasource:
    url: ENC(Oxpc++igRsuJSCMb4cNJiN7tpna46QcTpDOMpjEd51lWpaYEELJ6asrk7jCmEHtlDaQ1GsDQ+B8VtdnQ1gg6w3uZ81a6KkGocQluWOuqmXI2yf5LQ0/r2d6LWN9FuqoqOeICVUcbmxY=)
    username: ENC(ytrxf1igA4bazqZ6TOOc1A==)
    password: ENC(j/o7k6nZe+yAMoWVWRnjFg==)