赞
踩
项目中经常会用到数据库,需要配置账号、密码登信息,由于这些信息都比较敏感,为了防止直接配置明文导致泄密风险,故通常是对密码明文进行加密处理,以下介绍jasypt对明文进行加密处理。
Jasypt Spring Boot 为 Spring Boot 应用程序中的属性源提供加密支持。有 3 种方法可以将 jasypt-spring-boot 集成到您的项目中:
如果使用 @SpringBootApplication 或 @EnableAutoConfiguration,只需将启动器 jar jasypt-spring-boot-starter 添加到您的类路径中即可在整个 Spring 环境中启用可加密属性 。
添加 jasypt-spring -boot 到您的类路径,并将 @EnableEncryptableProperties 添加到您的主配置类,以在整个 Spring 环境中启用可加密属性 。
将 jasypt-spring-boot 添加到您的类路径,并使用 @EncrytablePropertySource 声明各个可加密属性源。
官网:https://github.com/ulisesbocchio/jasypt-spring-boot
官网:https://github.com/ulisesbocchio/jasypt-spring-boot
如果是 Spring Boot 应用程序,使用了注解 @SpringBootApplication 或者 @EnableAutoConfiguration,那么只需添加 jasypt-spring-boot-starter 依赖,此时整个 Spring 环境就会支持可加密属性配置(这意味着任何系统属性、环境属性、命令行参数,yaml、properties 和任何其他自定义属性源可以包含加密属性):
com.github.ulisesbocchio
jasypt-spring-boot-starter
3.0.5
如果您不使用 @SpringBootApplication 或 @EnableAutoConfiguration 自动配置注释,则将此依赖项添加到您的项目中:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>3.0.5</version>
</dependency>
然后将 @EnableEncryptableProperties 添加到配置类中,以便在整个 Spring 环境中启用可加密属性:
@Configuration
@EnableEncryptableProperties
public class MyApplication {
...
}
如果您不使用 @SpringBootApplication 或 @EnableAutoConfiguration 自动配置注释,并且您不想在整个 Spring 环境中启用可加密属性,那么还有第三种选择。首先将以下依赖项添加到您的项目中:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>3.0.5</version>
</dependency>
然后在配置文件中添加任意数量的 @EncryptablePropertySource 注解,就像使用 Spring 的 @PropertySource 注解一样:
@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication {
...
}
或者还可以使用 @EncryptablePropertySources 注解来对 @EncryptablePropertySource 类型的注解进行分组:
@Configuration
@EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),
@EncryptablePropertySource("classpath:encrypted2.properties")})
public class MyApplication {
...
}
注意,从版本 1.8 开始,@EncryptablePropertySource 支持 YAML 文件。
唯一需要的属性是加密密码,其余的可以保留使用默认值。虽然所有这些属性都可以在属性文件中声明,但加密器密码不应存储在属性文件中,而应作为系统属性、命令行参数或环境变量传递,并且只要其名称为 jasypt.encryptor .password 就可以了。
最后一个属性 jasypt.encryptor.proxyPropertySources 用于指示 jasyp-spring-boot 如何拦截属性值以进行解密。默认值 false 使用 PropertySource、EnumerablePropertySource 和 MapPropertySource 的自定义包装器实现。当为此属性指定 true 时,拦截机制将在每个特定 PropertySource 实现上使用 CGLib 代理。这在某些必须保留原始 PropertySource 类型的场景中可能很有用。
加密属性类com.ulisesbocchio.jasyptspringboot.properties.JasyptEncryptorConfigurationProperties
加密属性查看:D:\maven-repository\com\github\ulisesbocchio\jasypt-spring-boot\3.0.3\jasypt-spring-boot-3.0.3.jar!\META-INF\spring-configuration-metadata.json。
对于加密器的自定义配置和加密器密码的来源,您始终可以在 Spring 上下文中定义自己的 StringEncryptor bean,并且默认的加密器将被忽略。例如:
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
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");
encryptor.setConfig(config);
return encryptor;
}
请注意,bean 名称是必需的,因为 jasypt-spring-boot 从版本 1.5 开始按名称检测自定义字符串加密器。默认的 bean 名称是:jasyptStringEncryptor。但也可以通过定义属性来覆盖这一点:jasypt.encryptor.bean
例如,如果您定义 jasypt.encryptor.bean=encryptorBean 那么您将使用该名称定义自定义加密器:
@Bean("encryptorBean")
public StringEncryptor stringEncryptor() {
...
}
如果您只想为加密属性使用不同的前缀/后缀,则可以继续使用所有默认实现,只需覆盖 application.properties (或 application.yml)中的以下属性:
jasypt:
encryptor:
property:
prefix: "ENC@["
suffix: "]"
<!-- jasypt加密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
# jasypt加密秘钥,生产环境建议在项目启动时,通过命令配置环境参数,防止密码泄露风险
jasypt:
encryptor:
# 加密算法,默认使用 PBEWithMD5AndDES
algorithm: PBEWithHMACSHA512AndAES_256
# 加密盐值
password: 6Sd96w7Bl8rS3KztOBEJ9jXmlokeOerQGs9
# 3.0.0版本及以上版本需要添加如下配置
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
package com.starsky; import org.jasypt.util.text.AES256TextEncryptor; import org.jasypt.util.text.BasicTextEncryptor; import org.jasypt.util.text.StrongTextEncryptor; /** * jasypt加解密 */ public class JasyptPasswordTest { public static void main(String[] args) { //默认使用加密算法:PBEWithMD5AndDES basicTextEncryptor(); //默认使用加密算法:PBEWithHMACSHA512AndAES_256 aES256TextEncryptor(); } /** * AES256TextEncryptor加解密,默认使用加密算法:PBEWithHMACSHA512AndAES_256 */ public static void strongTextEncryptor() { //默认使用加密算法:PBEWithMD5AndTripleDES StrongTextEncryptor textEncryptor = new StrongTextEncryptor(); // 加密秘钥(盐值) textEncryptor.setPassword("6Sd96w7Bl8rS3KztOBEJ9jXmlokeOerQGs9"); // 对账号加密 String encUsername = textEncryptor.encrypt("root"); System.out.println("加密结果:" + encUsername); final String decrypt = textEncryptor.decrypt("eoxcn/Mt11DeqXtGGlHFo29"); System.out.println("解密结果:" + decrypt); } /** * AES256TextEncryptor加解密,默认使用加密算法:PBEWithHMACSHA512AndAES_256 */ public static void aES256TextEncryptor() { //默认使用加密算法:PBEWithHMACSHA512AndAES_256 AES256TextEncryptor textEncryptor = new AES256TextEncryptor(); // 加密秘钥(盐值) textEncryptor.setPassword("6Sd96w7Bl8rS3KztOBEJ9jXmlokeOerQGs9"); // 对账号加密 String encUsername = textEncryptor.encrypt("root"); System.out.println("加密结果:" + encUsername); final String decrypt = textEncryptor.decrypt("eoxcn/Mt11DeqXtGGlHFo29"); System.out.println("解密结果:" + decrypt); } /** * BasicTextEncryptor加解密,默认使用加密算法:PBEWithMD5AndDES */ public static void basicTextEncryptor() { //默认使用加密算法:PBEWithMD5AndDES BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); // 加密秘钥(盐值) textEncryptor.setPassword("6Sd96w7Bl8rS3KztOBEJ9jXmlokeOerQGs9"); // 对账号加密 String encUsername = textEncryptor.encrypt("root"); System.out.println("加密结果:" + encUsername); final String decrypt = textEncryptor.decrypt("eoxcn/Mt11DeqXtGGlHFo"); System.out.println("解密结果:" + decrypt); } }
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://localhost:3306/ruoyi-pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: ENC(eoxcn/Mt11DeqXtGGlHFo29hzN3xjrklVHrHE8ZjA4XulldZ/8R4C93lgoWnzb23)
password: ENC(eoxcn/Mt11DeqXtGGlHFo29hzN3xjrklVHrHE8ZjA4XulldZ/8R4C93lgoWnzb23)
可以看到服务已经启动成功,数据库连接数据库正常,在测试接口查询数据库验证。
访问swagger验证:
http://localhost:9999/tbs/swagger-ui.html
选择数据字典控制器查询数据库接口测试加密后的数据密码是否生效。
可以看到查询数据库成功,以上表示数据库加密成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。