在Spring配置文件中常使用占位符(placeholder )来加载资源文件,常常一些资源文件都是已明文形式存放的,比如jdbc配置信息等,从系统安全角度来说,这些信息已明文形式显示总是不好。今天接触Jasypt,查了一些资料学习了下。
Jasypt 是sourceforge.net上的一个开源项目,是一个Java库。更多介绍自行google吧。
加入Jasypt依赖
这里我们使用maven
1 2 3 4 5
| <dependency> <groupId>org.jasypt</groupId> <artifactId>jasypt</artifactId> <version>1.8</version> </dependency>
|
加密
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Test public void encrypt() { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig(); config.setAlgorithm("PBEWithMD5AndDES"); config.setPassword("fuyung"); encryptor.setConfig(config);
String plaintext = "root"; String ciphertext = encryptor.encrypt(plaintext); System.out.println(plaintext + " : " + ciphertext); }
|
解密
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Test public void decrypt() { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig(); config.setAlgorithm("PBEWithMD5AndDES"); config.setPassword("fuyung"); encryptor.setConfig(config); String ciphertext = "8y9G4kIZQuCHB78mMJNkHw==";
String plaintext = encryptor.decrypt(ciphertext); System.out.println(ciphertext + " : " + plaintext); }
|
与Spring集成
在Spring的配置文件里面加入如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <bean id="propertyConfigure" class="org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer"> <constructor-arg ref="configurationEncryptor"/>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> <property name="ignoreResourceNotFound" value="true"/> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"> <property name="config" ref="environmentVariablesConfiguration"/> </bean>
<bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"> <property name="algorithm" value="PBEWithMD5AndDES"/> <property name="password" value="clm"/> </bean>
|
在看一下jdbc.properties文件:
1 2
| jdbc.username=ENC(kpKWmxAX2LMUqqkKPCulpTimxznTDxXw) jdbc.password=ENC(Wg/U1YMQOznH4WyP7HpTTJL0v1KGFLIC)
|
注意在你的密文前加上ENC前缀,并用()包起来。为什么要这样写,查看源码便知:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public final class PropertyValueEncryptionUtils {
private static final String ENCRYPTED_VALUE_PREFIX = "ENC("; private static final String ENCRYPTED_VALUE_SUFFIX = ")";
public static boolean isEncryptedValue(final String value) { if (value == null) { return false; } final String trimmedValue = value.trim(); return (trimmedValue.startsWith(ENCRYPTED_VALUE_PREFIX) && trimmedValue.endsWith(ENCRYPTED_VALUE_SUFFIX)); } }
|
这样子在启动Spring容器的时候就会读取到加密的值就会自动进行解密了。