目录
4.1 yml或properties文件中 (简单但不安全)
开发和测试环境还好,但生产如果采用明文配置会有安全问题,一般都是经过加密的;
今天主要讲的是使用Jasypt库完成数据库敏感信息加密;
Jasypt 是一个 java 库,它允许开发人员以最小的努力将基本的加密功能添加到他/她的项目中,而无需深入了解密码学的工作原理。
· 高安全性、基于标准的加密技术,适用于单向和双向加密。加密密码、文本、数字、二进制文件…
· 适合集成到基于Spring的应用程序中,也可以与Spring Security透明地集成。
· 用于加密应用程序(即数据源)配置的集成功能
· 多处理器/多核系统中高性能加密的特定功能。
官网: Jasypt: Java simplified encryption - Jasypt: Java simplified encryption - Main
与springboot集成
1、引入jar包:
–这里以3.0.3版本,对应的jasypt版本 1.9.3
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
2、 生成加密数据字符串:
这里介绍两种:
· 命令行
· java代码
2.1 命令行加密
进入到本地jar 包仓库,使用cmd 或者 git bash 工具
加密:
java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password=salt algorithm=PBEWithMD5AndTripleDES input=password
该命令将使用密码
pkslow
和加密算法PBEWithMD5AndTripleDES
对字符串password
进行加密。加密后的结果将显示在命令行窗口中,由于其使用的是PBEWithMD5AndDES加密方式,所以每次加密出来的结果都不一样,但是解密都是一样的。
解密:java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI p assword=salt algorithm=PBEWithMD5AndTripleDES input=yZ+fSk2aKpbveRDOGHbIRzPVX5AT
该命令将使用密码
salt
和解密算法PBEWithMD5AndTripleDES
对字符串yZ+fSk2aKpbveRDOGHbIRzPVX5AT
进行解密。解密后的结果将显示在命令行窗口中。命令描述:
-cp ./jasypt-1.9.3.jar
:通过指定-cp
参数设置 Jasypt 库的类路径。这告诉 Java 虚拟机在运行命令时加载jasypt-1.9.3.jar
文件。
org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI
:指定要执行的主类。这是 Jasypt 库提供的命令行界面类。
password=
salt:设置加密操作的密码。在这个例子中,密码设置为 salt(尽量复杂)。
algorithm=PBEWithMD5AndTripleDES
:指定要使用的加密算法。在这个例子中,使用PBEWithMD5AndTripleDES
算法进行加密。
input=password
:指定要加密的输入字符串。在这个例子中,要加密的字符串是password
。
加密示例:
2.2 java 代码
package com.jfsoft.interfaces.utils;
import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @描述:
* @Date: 2023/4/9
* @Description: // PC002
**/
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class CsPeisTest {
@Test
public void testEncyptedPassword() {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
//config.setPasswordEnvName("PLATFORM_KEY");
config.setAlgorithm("PBEWithMD5AndDES");
config.setPassword("salt");
encryptor.setConfig(config);
String name = "sa";
String password = "123456";
//对敏感数据加密
log.info("name>>>{} 加密后>>{}", name, encryptor.encrypt(name));
log.info("password>>>{} 加密后>>{}", name, encryptor.encrypt(password));
log.info("name 解密后>>{}", encryptor.decrypt(encryptor.encrypt(name)));
log.info("password 解密后>>{}", encryptor.decrypt(encryptor.encrypt(password)));
}
}
输出
name>>>sa 加密后>>ZzS0VVbgIL7zQXbMcwTcyg== password>>>123456 加密后>>jqNNNEzhU6ZUquYSDzKciw== name 解密后>>sa password 解密后>>123456
3、 配置文件中使用
只需要使用默认的前缀 ENC()包裹,括号内就是加密后的字符
spring.datasource.dynamic.datasource.sqlserver.url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ceshi
spring.datasource.dynamic.datasource.sqlserver.username=ENC(ZzS0VVbgIL7zQXbMcwTcyg==)
spring.datasource.dynamic.datasource.sqlserver.password=ENC(jqNNNEzhU6ZUquYSDzKciw==)
spring.datasource.dynamic.datasource.sqlserver.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
jasypt.encryptor.password=salt
jasypt.encryptor.algorithm=PBEWithMD5AndDES
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator
4、关于Jasypt敏感配置存放位置(盐值、算法等)
4.1 yml或properties文件中 (简单但不安全)
jasypt.encryptor.password=salt
4.2 代码内配置
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor1() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("d947a954-salt");
config.setAlgorithm("PBEWithMD5AndTripleDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize(Runtime.getRuntime().availableProcessors());
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
4.3 JVM参数方式
# 项目启动时,带入以下参数
-Djasypt.encryptor.password=salt
配置好后,直接启动项目即可,jasypt检测到
ENC后会自动解密,快去试试吧
!