【开发经验】springboot配置文件加密详解

前言

​ 一般情况下,为了方便切换环境,我们会将关于环境的信息是极为敏感的信息,一旦泄露,会造成很大的损失。因此,一般开发者会将配置文件中进一步加密,避免这些敏感信息让不法分子直接获取。

解决思路

​ 在springboot工程中,实现配置文件的加密十分简单,只需要引入jasypt的jar包就可以。

引入jar

<dependency>         <groupId>com.github.ulisesbocchio</groupId>         <artifactId>jasypt-spring-boot-starter</artifactId>         <version>2.0.0</version> </dependency> 

引入之后,通过工具类计算密文。

public class JasyptUtils { 	/** 	 * Jasypt生成加密结果 	 * 	 * @param password 配置文件中设定的加密密码 jasypt.encryptor.password 	 * @param value    待加密值 	 * @return 	 */ 	public static String encryptPwd (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)); 		String result = encryptOr.decrypt (value); 		return result; 	}  	/** 	 * @param password salt 	 * @return 	 */ 	public static SimpleStringPBEConfig cryptOr (String password) 	{ 		SimpleStringPBEConfig config = new SimpleStringPBEConfig (); 		config.setPassword (password); 		config.setAlgorithm (StandardPBEByteEncryptor.DEFAULT_ALGORITHM); 		config.setKeyObtentionIterations ("1000"); 		config.setPoolSize ("1"); 		config.setProviderName (null); 		config.setSaltGeneratorClassName ("org.jasypt.salt.RandomSaltGenerator"); 		config.setStringOutputType ("base64"); 		return config; 	}  	public static void main (String[] args) 	{ 		// 加密         // 盐值替换成自己熟悉的口令,此口令为解密密钥,需要妥善保管。 		System.out.println (encryptPwd ("yanzhi", "root")); 		System.out.println (encryptPwd ("yanzhi", "123456")); 	} 

输出:

uzL6GFC8aJustxilk9pY5Q==
Bs8ZOkgf6tKD7PWKcl6RzQ==

在main方法中修改自己熟悉的口令和密文即可。最后将输出的值替换在配置文件中,通过ENC()进行包裹。例如:ENC(uzL6GFC8aJustxilk9pY5Q==)
最后替换配置文件的信息即可。配置文件要添加密钥。yanzhi可以自行修改。

jasypt:   encryptor:     password: yanzhi 

mysql的账号密码可以为

username: ENC(sdasdQSDQWFSADS==) 

jasypt原理

​ 此加密的原理非常简单。众所周知,spring在读取配置文件之后,生成bean之前会生成BeanDefinition,jasypt的加密原理就是生成BeanDefinition之后,对BeanDefinition中的信息进行了修改,将其密文进行转换。核心类在EnableEncryptablePropertiesBeanFactoryPostProcessor中。

public class EnableEncryptablePropertiesBeanFactoryPostProcessor implements BeanFactoryPostProcessor, ApplicationListener<ApplicationEvent>, Ordered {      private static final Logger LOG = LoggerFactory.getLogger(EnableEncryptablePropertiesBeanFactoryPostProcessor.class);     private ConfigurableEnvironment environment;     private InterceptionMode interceptionMode;           @Override     public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {         //此处是将密文还原为明文的逻辑         LOG.info("Post-processing PropertySource instances");         EncryptablePropertyResolver propertyResolver = beanFactory.getBean(RESOLVER_BEAN_NAME, EncryptablePropertyResolver.class);         MutablePropertySources propSources = environment.getPropertySources();         convertPropertySources(interceptionMode, propertyResolver, propSources);     } } 

​ 当看到此类实现了BeanFactoryPostProcessor类的时候,这个加密解密的思路就很明显了。因为spring提供了BeanFactoryPostProcessor接口里面有postProcessBeanFactory方法,此方法是用来在spring创建BeanDefinition之后,提供对BeanDefinition内的信息进行修改。

版权声明:玥玥 发表于 2021-05-08 19:45:18。
转载请注明:【开发经验】springboot配置文件加密详解 | 女黑客导航