Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Boot how to hide passwords in properties file

Spring Boot uses the properties file, and at least by default, the passwords are in plain text. Is it possible to somehow hide/decrypt these?

like image 855
user1340582 Avatar asked May 24 '16 04:05

user1340582


People also ask

What is Jasypt encryptor password?

Jasypt stands for Java simplified encryption which is high security and high-performance encryption library to encrypt the sensitive information. Provides the standard encryption techniques for encryption the passwords, texts, etc.


1 Answers

You can use Jasypt to encrypt properties, so you could have your property like this:

db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=) 

Jasypt allows you to encrypt your properties using different algorithms, once you get the encrypted property you put inside the ENC(...). For instance, you can encrypt this way through Jasypt using the terminal:

encrypted-pwd$ java -cp ~/.m2/repository/org/jasypt/jasypt/1.9.2/jasypt-1.9.2.jar  org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="contactspassword" password=supersecretz algorithm=PBEWithMD5AndDES  ----ENVIRONMENT-----------------  Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 24.45-b08    ----ARGUMENTS-------------------  algorithm: PBEWithMD5AndDES input: contactspassword password: supersecretz    ----OUTPUT----------------------  XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88= 

To easily configure it with Spring Boot you can use its starter jasypt-spring-boot-starter with group ID com.github.ulisesbocchio

Keep in mind, that you will need to start your application using the same password you used to encrypt the properties. So, you can start your app this way:

mvn -Djasypt.encryptor.password=supersecretz spring-boot:run 

Or using the environment variable (thanks to spring boot relaxed binding):

export JASYPT_ENCRYPTOR_PASSWORD=supersecretz mvn spring-boot:run 

You can check below link for more details:

https://www.ricston.com/blog/encrypting-properties-in-spring-boot-with-jasypt-spring-boot/

To use your encrypted properties in your app just use it as usual, use either method you like (Spring Boot wires the magic, anyway the property must be of course in the classpath):

Using @Value annotation

@Value("${db.password}") private String password; 

Or using Environment

@Autowired private Environment environment;  public void doSomething(Environment env) {     System.out.println(env.getProperty("db.password")); } 

Update: for production environment, to avoid exposing the password in the command line, since you can query the processes with ps, previous commands with history, etc etc. You could:

  • Create a script like this: touch setEnv.sh
  • Edit setEnv.sh to export the JASYPT_ENCRYPTOR_PASSWORD variable

    #!/bin/bash

    export JASYPT_ENCRYPTOR_PASSWORD=supersecretz

  • Execute the file with . setEnv.sh
  • Run the app in background with mvn spring-boot:run &
  • Delete the file setEnv.sh
  • Unset the previous environment variable with: unset JASYPT_ENCRYPTOR_PASSWORD
like image 128
Federico Piazza Avatar answered Sep 28 '22 09:09

Federico Piazza