引言:数据库密码等信息不能直接放在程序中,应该进行加密处理。根据网上的资料整理了用Jasypt加密的过程。
1. 添加依赖
<!-- jasypt -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
网上大部分版本现在都是使用的3.0.3版本
2. 添加配置信息
jasypt:
encryptor:
# 加密的盐值,为了安全,该配置可以放在启动参数或者命令行参数中
password: fa7bd4edd42448aea8c9484fbce6e8cd
# 加密所采用的算法
algorithm: PBEWITHHMACSHA512ANDAES_256
这里的password是加密算法的密钥,事实上密钥不应该直接放在文件中,后面会提到密钥的处理,这里为了方便暂时放在配置文件中。
3. 密文替换
生成密文的方式有多种,这里介绍常见的两种。
3.1 方式一(java文件加密)
import org.jasypt.encryption.StringEncryptor;
public void encrypt() {
String url = encryptor.encrypt("jdbc:mysql://ubuntu:3306/jasypt?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
String username = encryptor.encrypt("root");
String pwd = encryptor.encrypt("password");
System.out.println("url = " + url);
System.out.println("username = " + username);
System.out.println("pwd = " + pwd);}
3.2 方式二(命令行加密)
// 加密命令
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input='root' password=abcdef algorithm=PBEWithMD5AndDES
// 解密命令
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input='z4xP29fuY4wF2AJqp1NnoGJxj' password=abcdef algorithm=PBEWithMD5AndDES
通过该种方式获取密文,需要到maven仓库下jasypt-1.9.3.jar包所在的路径下执行,否则会报找不到对应的主类。
4. 替换明文
对数据库地址、用户名、密码进行加密后,打印出生成的密文,并且替换掉配置文件中的明文:
spring:
datasource:
url: ENC(RSSEciOYx39dlPxCWeP46RZG1wkgtuPMgaZu2XgnrPluvHcAIzIEW79K1j9WIWLVHPbBpb6t1ehiiTiQGnzR1CFvrFm16bE0koyh/8exbh1ulYkfaSdBOivNHIF6CSxPy54vmxn3LaXug6ZYxfNBymQINbRa2fsXxlHT+TgvKqs=)
username: ENC(YkJGWv80AEpPREn3Rt2Ic6BzzO+v+3m5Uy/r33pz4ZbZbD3vhi7vJz9nwGHKg8+n)
password: ENC(4lEHAy//ExXjJxN9WQgyqgAjSkzIJ3irTYTYG8so6HgZWxPRl6Pa8tCUK/qmXSYb)
driver-class-name: com.mysql.cj.jdbc.Driver
ENC()是固定格式,括号里是上一步生成的密文。
5. 密钥的存储
为了避免密钥泄露,推荐两种存储方法:
- 把秘钥当做程序启动时的命令行参数
java -jar xxx.jar --jasypt.encryptor.password=秘钥
java -jar xxx.jar 是一条命令行操作,用于在 Java 环境中运行可执行的 JAR 文件。
- 把秘钥当做程序启动时环境变量
java -Djasypt.encryptor.password=秘钥 -jar xxx.jar
'-Djasypt.encryptor.password=秘钥’ 是通过命令行参数 -D 来设置系统属性的方式,其中 jasypt.encryptor.password 是 Jasypt 加密器的密码属性名,而 秘钥 则是你要设置的具体密码值。