赞
踩
Jasypt是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。它可以帮助开发人员在应用程序中加密密码、敏感信息和数据通信,还包括高安全性、基于标准的加密技术、可同时单向和双向加密的加密密码、文本、数字和二进制文件。如果您正在使用Spring Boot,Jasypt可以与Spring Boot集成,使加密和解密过程更加简单。
<!-- SpringBoot 版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/>
</parent>
<!-- jasypt 加密 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
/**
* 自定义的属性探测器和密码解析器
*/
@Component
public class CustomEncryptableProperty {
@Bean(name = "encryptablePropertyDetector")
public EncryptablePropertyDetector encryptablePropertyDetector() {
return new CustomEncryptablePropertyDetector();
}
@Bean("encryptablePropertyResolver")
public EncryptablePropertyResolver encryptablePropertyResolver(EncryptablePropertyDetector encryptablePropertyDetector) {
return new CustomEncryptablePropertyResolver(encryptablePropertyDetector);
}
}
/** * 自定义的属性探测器 */ public class CustomEncryptablePropertyDetector implements EncryptablePropertyDetector { /** * 探测字符串 */ private final String flagStr = "ENC@"; /** * 是否为可以解密的字符串【自定义规则为 flagStr 开头】 * * @param value 全部的字符串 * @return 是否是解密的字符串,true,是,false,否 */ @Override public boolean isEncrypted(String value) { if (value != null) { return value.startsWith(flagStr); } return false; } /** * 截取到除了标识之后的值【截取 flagStr 之后的字符串】 * * @param value 带前缀 * @return string 去掉标识符的字符串 */ @Override public String unwrapEncryptedValue(String value) { return value.substring(flagStr.length()); } }
EncryptionUtil.toDecrypt()
就是自定义的解密方法,与加密对象的加密方法相对应。/** * 自定义的密码解析器 */ public class CustomEncryptablePropertyResolver implements EncryptablePropertyResolver { /** * 属性探测器 */ private final EncryptablePropertyDetector detector; public CustomEncryptablePropertyResolver(EncryptablePropertyDetector detector) { this.detector = detector; } /** * 处理真正的解密逻辑 * * @param value 原始值 * @return 如果值未加密,返回原值,如果加密,返回解密之后的值 */ @Override public String resolvePropertyValue(String value) { return Optional.ofNullable(value) .filter(detector::isEncrypted) .map(resolvedValue -> { try { // 1.过滤加密规则后的字符串 String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim()); // 2.解密 return EncryptionUtil.toDecrypt(unwrappedProperty); } catch (EncryptionOperationNotPossibleException e) { throw new DecryptionException("Unable to decrypt: " + value + ". Decryption of Properties failed, make sure encryption/decryption " + "passwords match", e); } }) .orElse(value); } }
spring:
datasource:
dynamic:
datasource:
# 主库数据源
master:
driver-class-name: org.postgresql.Driver
url: ENC@URLENCStr
username: ENC@UsernameENCStr
password: ENC@PasswordENCStr
用户名及密码甚至是URL使用密文的安全性是很高的,本文参考知乎软件架构师:代码小咖
SpringBoot 配置文件这样加密,才足够安全!,感谢大佬的分享,Jasypt 的使用还有很多自定义的方式,可查看原文学习。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。