使用jasypt对spring boot配置文件中的敏感信息进行非对称加密

894 阅读2分钟

简述

总体思路是使用jasypt对application.yml中敏感信息进行公钥加密,然后spring boot用私钥解密。 我不是密码学的专家,欢迎指出错误。

使用openssl生成公钥和私钥

生成私钥

openssl genrsa -out private.pem 2048

用户输入密码,然后生成的加密了的私钥。

使用私钥生成公钥

openssl rsa -in private.pem -outform PEM -pubout -out public.pem

用户需要输入刚才的密码。

一个坑

不知道为什么,jasypy读取上述生成的私钥后,项目启动会报错。上网搜了一下,发现如果使用未加密的PKCS8结构的密钥,项目就能正常运行。

openssl pkcs8 -topk8 -inform pem -in private.pem -outform pem -nocrypt -out privatepkcs8.pem

这是项目最终使用的私钥。

安装jasypt-spring-boot-starter

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

安装jasypt的maven插件

<plugin>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-maven-plugin</artifactId>
    <version>3.0.4</version>
</plugin>

编写配置文件

配置jasypt

jasypt:
  encryptor:
    private-key-format: pem
    private-key-location: classpath:jasypt/privatepkcs8.pem

指定未加密的PKCS8结构的密钥的classpath和格式(PEM)

配置数据库密码等敏感信息

spring:
  datasource:
    username: DEC(<username>)
    password: DEC(<password>)

将未加密用户名和密码用DEC() 包起来。然后让jasypt的maven插件处理配置文件。

jasypt的maven插件处理配置文件

./mvnw  jasypt:encrypt
-Djasypt.encryptor.public-key-format="pem" 
-Djasypt.encryptor.public-key-location="file:src/main/resources/jasypt/public.pem"  
-Djasypt.plugin.path="file:src/main/resources/application.yml"

指定公钥文件的格式,公钥文件的位置,以及配置文件application.yml的位置,然后用户名和密码就会变成这样:

spring:
  datasource:
    username: ENC(mey4nOSinR9AWbhc72STQLeaiQJwkUNGZIwfFqtYQyR94xoblGBAhZQbZQMm3er3M95vJNzvga34bXonEeZt5JBSXyFvvMaFpfApG9VA6OpXBaXmyB5DMrk+Fo182+GY6mqWaua38mhFskDOV/buhSzEW7akh6RrFntzfZMUDiJVb0+uduKW0Y//vOadOtfTKBFcuNOuBkARw8ETatwzUED1OB+Q4+PDVdFUSAylzYCdLccKNpZ2sOHPeTx8J36lm7CcndLB0oHfK1NlwmPq/BYEevLxQ+04phThTjkqR7aoiY0CtO6BQTfPKvZ8gEw2XDFE3aChJgH1WyF9cLCsbg==)
    password: ENC(Kpyhj7RrARRkENW1d0Z6KnkpaP16zbItIoVSgGaSbOG12Wkwgy7QWGFMbEJCAJI91fiLnIQyLM++K3nR5QJ/wmLwpMCTq2StWm+xRdBTk0pmGeDmVD9dqKvSg82g3FejY3kJGfedogrRvL5mW+zVB37/b310hqvLjn0IxoSh9g8NJkSTGD2TUZ763bh5RiILMTaUHIFFBhAttqapgrzPcMymZmBA8IYhC1JmHGNz/Ibx1SqBsiO5zXiayHe8nQS8vPzdIUewpMB5mSFmAAZJKdd4iyig3D+Ia0jL7qvAqgUob6we+aIRunM/fyKaz9twVZNJy8s7Pxn4S6vdygkCrQ==)

以上就是使用jasypt对spring boot配置文件中的敏感信息进行非对称加密的大致流程。