使用Jasypt加密spring boot应用配置文件的敏感信息

Jasypt是一个Java库,允许开发人员以很简单的方式添加基本加密功能,而无需深入研究加密原理。利用它可以实现高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件。

使用jasypt:

1、引入jasypt的maven依赖:

<!-- Jasypt加密 -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

2.开发环境中可以编写一个工具类对需要加密的字符串进行加密

import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;


@Slf4j
public class JasyptUtil {

    /**
     * Jasypt生成加密结果
     * @param password 配置文件中设定的加密密码 jasypt.encryptor.password
     * @param value 待加密值
     * @return
     */
    public static String encyptPwd(String password,String value){
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(cryptor(password));
        String result = encryptor.encrypt(value);
        return result;
    }

    /**
     * 解密
     * @param password 设置盐值(加密解密密钥) jasypt.encryptor.password
     * @param value 待解密密文
     * @return
     */
    public static String decyptPwd(String password,String value){
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(cryptor(password));
        encryptor.decrypt(value);
        String result = encryptor.decrypt(value);
        return result;
    }

    public static SimpleStringPBEConfig cryptor(String password){
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password);
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize(1);
        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){

        //加密 若修改了第一个参数加密password记得在配置文件同步修改
        System.out.println("加密后:"+encyptPwd("xiaomifeng1010","123456"));
        //解密
        System.out.println("解密后:"+decyptPwd("xiaomifeng1010","jWdJUXTpRZPAIyBwH5cC4gLiY/CA++A6VMoOrXl1EjOu2SUiONUDA/trq8fjpG/i"));
    }
}

例如,现在需要对application.yml配置文件中的数据库连接的用户密码进行加密:

# 设置盐值(加密解密密钥), 生产环境中可通过环境变量、命令行等形式进行设置
jasypt:
  encryptor:
    password: xiaomifeng1010

server:
  port: 8888
  servlet:
    context-path: /
  tomcat:
    uri-encoding: UTF-8
    max-threads: 1000
    min-spare-threads: 30

spring:
  # 数据源
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    # Jasypt加密 可到common-utils中找到JasyptUtil加解密工具类生成加密结果 格式为ENC(加密结果) 以下解密结果为123456
    password: ENC(s1IqO0kn3jDReVSk7ZLiHOVxsTN89nm/exox2AhdtG1sH2Jd7PEXIILoS4YenkuP)
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    logSlowSql: true
    # Druid StatViewServlet配置
    druid:
      stat-view-servlet:
        # 默认true 内置监控页面首页/druid/index.html
        enabled: true
        url-pattern: /druid/*
        # 允许清空统计数据
        reset-enable: true
        login-username: root
        login-password: ENC(s1IqO0kn3jDReVSk7ZLiHOVxsTN89nm/exox2AhdtG1sH2Jd7PEXIILoS4YenkuP)
        # IP白名单 多个逗号分隔
        allow:
        # IP黑名单
        deny:
      filter:
        stat:
          # 显示慢sql 默认当超过3秒显示
          log-slow-sql: true
  jpa:
    # 显示sql
    show-sql: true
    # 自动生成表结构
    generate-ddl: true
    hibernate:
      ddl-auto: update
  # Redis
  redis:
    host: 127.0.0.1
    password:
    # 数据库索引 默认0
    database: 0
    port: 6379
    # 超时时间 Duration类型 3秒
    timeout: 3S
  # Elasticsearch
  data:
    elasticsearch:
      client:
        reactive:
          # 要连接的ES客户端 多个逗号分隔
          endpoints: 127.0.0.1:9300
      # 暂未使用ES 关闭其持久化存储
      repositories:
        enabled: false

我本地的mysql数据库连接的用户密码是:123456

于是使用刚才的工具类加密一下123456

可以看到使用 Jasypt加密同样的字符串,每次得到的结果并不一样,main方法中的解密输出中的值,和这次加密后的值不相同,那是因为main方法中解密输出的值是上次生成的。但是还是可以成功解密为:123456

字符串“xiaomifeng1010”相当于加密的一个密钥(或者称其为盐值)的作用。

加密后的结果:s1IqO0kn3jDReVSk7ZLiHOVxsTN89nm/exox2AhdtG1sH2Jd7PEXIILoS4YenkuP放在配置文件application.yml中,密码部分使用ENC()包裹。

 之后像往常一样使用@Value("${}")获取该配置即可,获取的是解密之后的值。

在生产环境中可通过环境变量、命令行等形式进行设置。

本身加解密过程都是通过盐值进行处理的,所以正常情况下盐值加密串是分开存储的。盐值应该放在系统属性命令行或是环境变量来使用,而不是放在同一个配置文件里面。

命令行存储方式示例:

java -jar xxx.jar --jasypt.encryptor.password=xxx &;

 环境变量存储方式示例:

设置环境变量(linux):

# 打开/etc/profile文件
vim /etc/profile
# 文件末尾插入
export JASYPT_PASSWORD = xxxx

启动命令:

java -jar xxx.jar --jasypt.encryptor.password=${JASYPT_PASSWORD} &;

说明:加密的时候,当然也可以不使用工具类,在开发过程中,自己写bat脚本:

@echo off
set/p input=待加密的明文字符串:
set/p password=加密密钥(盐值):
echo 加密中......
java -cp jasypt-3.0.0.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI  ^
input=%input% password=%password% ^
algorithm=PBEWithMD5AndDES
pause
  • 使用 jasypt-3.0.0.jar中的org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI类进行加密
  • input参数是待加密的字符串,password参数是加密的密钥(盐值)
  • 使用PBEWithMD5AndDES算法进行加密

注意:jasypt-3.0.0.jar 文件需要和bat脚本放在相同目录下

发布了74 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u011174699/article/details/103948444