一般情况下,配置文件会包含数据库账号密码、业务的一些密钥等重要的敏感信息,如果这些信息泄露,会产生严重后果,因此对这些敏感信息加密是必不可少的。
这 是一个 java 库,它允许开发人员以最小的努力将基本的加密功能添加到他/她的项目中,而无需深入了解密码学的工作原理 ,官网如下:http://www.jasypt.org/
其最核心的步骤就两个:
构建springboot项目,该示例是基于springboot版2.7.3,jdk17,jasypt版本是3.04
1.引入依赖
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.4</version></dependency>
2.配置文件
这是数据库账号密码的一个配置
spring.datasource.username=rootspring.datasource.password=root
现在需要对username和password进行加密,加密后的结果如下:
spring.datasource.username=ENC(eIOQM9aChGP4/CQk7RXAM7ZSK7AIBI9faeQb31M5/ouChpMIDHlB2+uSsIaZmxQU)spring.datasource.password=ENC(Y+tFn7NIUjXhUjtyfpDmI7EfL9ORPiRKSKrnxU+3wfFcHUo9cl2/wv4uAlc56lng)
ENC()是jasypt的一个标识符
3.利用代码程序加密(写一个加密工具)
这是一个小demo,所有的项目都可以使用这个工具生成加密密码
核心代码如下:
package com.xm.demo.common.jasypt;import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;import org.jasypt.iv.RandomIvGenerator;import org.springframework.stereotype.Component;@Componentpublic class Jasypt { private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES"; private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256"; /** * 加密 * @param str 加密的字符 * @param salt 密钥 * @return java.lang.String */ public String encryption(String str,String salt){ StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); encryptor.setPassword(salt); encryptor.setAlgorithm(PBEWITHHMACSHA512ANDAES_256); encryptor.setIvGenerator(new RandomIvGenerator()); return encryptor.encrypt(str); } /** * 解密 * @param str 解密的字符 * @param salt 密钥 * @return java.lang.String */ public String decryption(String str, String salt){ StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); encryptor.setPassword(salt); encryptor.setAlgorithm(PBEWITHHMACSHA512ANDAES_256); encryptor.setIvGenerator(new RandomIvGenerator()); return encryptor.decrypt(str); }}
4.添加配置参数
jasypt.encryptor.password=demo
这个配置是必须的,但这里有个问题就是,把加密的密钥放到配置文件里,如果泄露了,别人还是可以解密的,因此需要把这个配置放到别的地方去,当然开发阶段把密钥放到配置中是没有问题的。
方式一: 直接作为程序启动时的命令行参数来带入
java -jar xxx.jar --jasypt.encryptor.password=demo
方式二: 直接作为程序启动时的应用环境变量来带入
java -Djasypt.encryptor.password=demo -jar xxx.jar
5.jasypt配置扩展
jasypt.encryptor.password=demo #加密密钥jasypt.encryptor.algorithm=PBEWITHHMACSHA512ANDAES_256 #加密算法(默认)jasypt.encryptor.property.prefix=ENC( #标识符jasypt.encryptor.property.suffix=) #标识符
实际开发的流程是这样的:
运维提供加密后的信息和密钥,例如加密后的账号密码,然后开发人员只需要在pom文件中添加jaspyt依赖,以及配置文件中加上jasypt.encryptor.password=密钥(开发阶段)。项目上线了,运维会把密钥作为程序启动时的命令行参数来带入 。