Springboot整合Jasypt实战
-
引入依赖
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
-
配置jasypt
# 配置jasypt相关信息 jasypt: encryptor: # 配置加密算法 algorithm: PBEWithMD5AndDES # 加密使用的秘钥(秘钥不建议出现在配置文件中) password: jaspyt_password property: # 算法识别前缀(当算法发现配置文件中的值以这前缀开始,后缀结尾时,会使用指定算法解密) prefix: ENC( # 算法识别后缀 suffix: )
-
使用jasypt生成密文
@SpringBootTest public class JasyptTest { @Autowired private StringEncryptor stringEncryptor; @Test public void jasyptTest(){ System.out.println("root加密:" + stringEncryptor.encrypt("root")); System.out.println("密码加密:" + stringEncryptor.encrypt("xxx")); } }
-
将数据库连接信息中的明文进行替换
spring: datasource: #数据库信息 username: ENC(7oFPCjLkJLw53LbghzgLXnTb6ASsEYrqDNCNsYe/r/ztvTwFBAQlc+InWS4/rC1S) password: ENC(z5L9s3/deJ/CYu9NWU7vTAEpb3GW9qB3H7T2nAnqDiityOrwEL7nXtT51VX0b0q8) url: jdbc:mysql://127.0.0.1:3306/jasyptTest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 driver-class-name: com.mysql.cj.jdbc.Driver
但是一般不将秘钥写入配置文件,写入配置文件也会产生一些安全问题
加密秘钥存储
方式一:将秘钥作为程序启动的命令行参数
java -jar xxx.jar --jasypt.encryptor.password=秘钥
方式二:将秘钥作为程序启动时的环境变量
java -Djasypt.encryptor.password=秘钥 -jar xxx.jar
方式三:自定义加密解密逻辑
-
自定义加密解密类
import org.jasypt.encryption.StringEncryptor; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.config.PBEConfig; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 自定义加密 */ @Configuration public class EncryptionConfig { @Bean("jasyptStringEncryptor") public StringEncryptor stringEncryptor() { DESEncrypt desEncrypt = new DESEncrypt(); return desEncrypt; } public class DESEncrypt implements StringEncryptor { /** * SimpleStringPBEConfig是Jasypt中的一个实现类,用于配置PBE算法的参数。 * 它提供了一些方法,可以设置密码、密钥迭代次数、算法、盐和IV生成器等。您可以使用它来配置PBE算法的参数, * 以便与StringEncryptor一起使用。 * @return */ private PBEConfig config(){ SimpleStringPBEConfig config = new SimpleStringPBEConfig(); //设置秘钥 config.setPassword("jaspyt_password"); //设置加密算法 config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); //这行代码设置了PBE加密算法从密码中推导密钥的迭代次数。 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; } /** * 加密 * @param s * @return */ @Override public String encrypt(String s) { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); encryptor.setConfig(config()); return encryptor.encrypt(s); } /** * 解密 * @param s * @return */ @Override public String decrypt(String s) { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); encryptor.setConfig(config()); return encryptor.decrypt(s); } } }