运行
运行时配置解密秘钥
-Djasypt.encryptor.password=
在idea中运行
命令行启动和docker中运行参见
https://www.cnblogs.com/zz0412/p/jasypt-001.html
Spring Boot: How to encrypt properties in application.properties
Sometimes you don’t want your properties to stay as plain text in application.properties file. Maybe you are connecting to a database and you have to write your database password in application.properties. In this tutorial, I am going to use Jasypt library for that purpose. Jasypt (Java Simplified Encryption) is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and without the need of having deep knowledge on how cryptography works.
Let’s begin,
First, add the related dependency to the project. I am using maven, so I will add the maven dependency to my pom.xml
<!– https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter –>
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency>
In the application.properties (or yaml), we will write our encrypted properties between parenthesis and put ENC keyword before it. Like;
MyProperty=ENC(23ClLWiedLx8v6XT6Wk+Bg==)
How to generate those encrpyted values? We will use Jasypt for that! Go to http://www.jasypt.org/ and download the latest version. When you are done, go into jasyptin and use the encrypt.sh or encrypt.bat to encrypt your variables. There are several algorithms to pick but I will leave it as default and only give my property value and secret to encrpyt it.
We only need to add @EnableConfigurationProperties annotation to our application and jasypt will automaticly detect encrypted values and decrypt them before they are being used. The CommandLineRunner I have added below is just to test the decryption mechanism.
@EnableEncryptableProperties
@SpringBootApplication
public class JasyptExampleApplication {
public static void main(String[] args) {
SpringApplication.run(JasyptExampleApplication.class, args);
}
@Component
public class MyRunner implements CommandLineRunner {
@Value(“${myProperty}”)
private String myProperty;
@Override
public void run(String… args) throws Exception {
System.out.println(“My property is = ” + myProperty);
}
}
}
But if you run your code like this, you will get the below error:
Error creating bean with name ‘demo.JasyptExampleApplication$MyRunner’: Injection of autowired dependencies failed; nested exception is java.lang.IllegalStateException: Required Encryption configuration property missing: jasypt.encryptor.password
This is because Jasypt needs to know the secret(password) to decrypt the property. We can tell this to our program several ways:
1- We can give it as a command line argument when running the application;
–jasypt.encryptor.password=MY_SECRET
2- We can set it as an environment variable, this is also useful when you are running your application on Tomcat. You can give it to Tomcat’s setenv.sh file;
export CATALINA_OPTS=”-Djasypt.encryptor.password=MY_SECRET”
You can also unset the environment variable after running the application, so there will be no doorway left behind, at least in a human-readable sense.
3- You can give it in application.properties but this might be the dumbest way as it has no difference with giving the property as plain text.
If you know a better way, write a comment below!
Now let’s look at the final output:
2018-04–25 14:03:26.413 INFO 10028 — [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource configurationProperties [org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource] to AOP Proxy
2018-04–25 14:03:26.413 INFO 10028 — [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource commandLineArgs [org.springframework.core.env.SimpleCommandLinePropertySource] to EncryptableEnumerablePropertySourceWrapper
2018-04–25 14:03:26.414 INFO 10028 — [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource systemProperties [org.springframework.core.env.MapPropertySource] to EncryptableMapPropertySourceWrapper
2018-04–25 14:03:26.414 INFO 10028 — [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource systemEnvironment [org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor$OriginAwareSystemEnvironmentPropertySource] to EncryptableMapPropertySourceWrapper
2018-04–25 14:03:26.414 INFO 10028 — [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource random [org.springframework.boot.env.RandomValuePropertySource] to EncryptablePropertySourceWrapper
2018-04–25 14:03:26.415 INFO 10028 — [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource applicationConfig: [classpath:/application.properties] [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper
2018-04–25 14:03:26.468 INFO 10028 — [ main] c.u.j.r.DefaultLazyPropertyResolver : Property Resolver custom Bean not found with name ‘encryptablePropertyResolver’. Initializing Default Property Resolver
2018-04–25 14:03:26.470 INFO 10028 — [ main] c.u.j.d.DefaultLazyPropertyDetector : Property Detector custom Bean not found with name ‘encryptablePropertyDetector’. Initializing Default Property Detector
2018-04–25 14:03:26.472 INFO 10028 — [ main] c.u.j.encryptor.DefaultLazyEncryptor : String Encryptor custom Bean not found with name ‘jasyptStringEncryptor’. Initializing Default String Encryptor
2018-04–25 14:03:26.478 INFO 10028 — [ main] c.u.j.encryptor.DefaultLazyEncryptor : Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWithMD5AndDES
2018-04–25 14:03:26.479 INFO 10028 — [ main] c.u.j.encryptor.DefaultLazyEncryptor : Encryptor config not found for property jasypt.encryptor.keyObtentionIterations, using default value: 1000
2018-04–25