前言
公司部门检查,要求系统配置文件中的敏感信息如数据库密码等,进行加密处理,否则将受到公司的安全处罚,无奈只要按照公司要求,对springboot项目配置文件的敏感信息进行加密和解密处理。详细教程如下。
第一步:在pom.xml添加第三方依赖
<dependency>
<groupid>com.github.ulisesbocchio</groupid>
<artifactid>jasypt-spring-boot-starter</artifactid>
<version>3.0.2</version>
</dependency>
第二步:添加加密配置
方式一:通过配置问年间 application.yml中增加jasypt配置
jasypt:
encryptor:
# 盐值
password: 123
# 指定加密方式
algorithm: pbewithmd5anddes
iv-generator-classname: org.jasypt.iv.noivgenerator
property:
# 标识为加密属性的前缀
prefix: enc(
# 标识为加密属性的后缀
suffix: )
这样还是会把加密信息暴漏,推荐使用配置类更加安全
方式二:通过配置类添加加密配置
import org.jasypt.encryption.stringencryptor;
import org.jasypt.encryption.pbe.pooledpbestringencryptor;
import org.jasypt.encryption.pbe.config.simplestringpbeconfig;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
@configuration
public class encryptconfig {
/**
* 自定义 stringencryptor,覆盖默认的 stringencryptor
* bean 名称是必需的,从 1.5 版开始按名称检测自定义字符串加密程序,默认 bean 名称为:jasyptstringencryptor
*
*/
@bean("jasyptstringencryptor")
public stringencryptor jasyptstringencryptor() {
pooledpbestringencryptor encryptor = new pooledpbestringencryptor();
simplestringpbeconfig config = new simplestringpbeconfig();
config.setpassword("tarzan");
config.setpoolsize("1");
config.setalgorithm("pbewithmd5anddes");
config.setkeyobtentioniterations("1000");
config.setprovidername("sunjce");
config.setsaltgeneratorclassname("org.jasypt.salt.randomsaltgenerator");
config.setivgeneratorclassname("org.jasypt.iv.randomivgenerator");
config.setstringoutputtype("base64");
encryptor.setconfig(config);
return encryptor;
}
}
第三步:在配置文件application.yml中密文替代明文。
spring:
redis:
##redis 单机环境配置
host: ${redis_host:127.0.0.1}
port: 6379
password: ${redis_password:enc(yissnr7kkhbglj0er+ysocr22x1xwgi+nx6eqpars48=)}
database: 5
ssl: false
data:
mongodb:
database: ${mongo_database:work_face_tmzk5}
host: ${mongo_host:127.0.0.1}
username: ${mongo_username:tarzan-mongo}
password: ${mongo_password:enc(xyz6qh/b1ynsqhtgqtq9tqn/6nixotnmbdf8ve57vh0=)}
datasource:
url: jdbc:postgresql://${postgres_host:127.0.0.1}:${postgres_port:5432}/${postgres_database:coalface_safety}
username: ${postgres_username:postgres}
password: ${postgres_password:enc(yissnr7kkhbglj0er+ysocr22x1xwgi+nx6eqpars48=)}
driver-class-name: org.postgresql.driver
enc(yissnr7kkhbglj0er+ysocr22x1xwgi+nx6eqpars48=) 只能单独使用,不能和其他文本拼接,下面是个错误例子:
spring:
data:
mongodb:
database: ${mongo_database:work_face_szls}
uri: mongodb://glqxzh:enc(yissnr7kkhbglj0er+ysocr22x1xwgi+nx6eqpars48=):27017
第四步::启动类加入开启加密注解
@enableencryptableproperties
@springbootapplication(scanbasepackages = appconstant.base_packages,exclude = {tenantdatasourceconfiguration.class})
public class coalfacesafetyapplication {
public static void main (string[] args) {
applicationcontext context =bladeapplication.run("coalface-safety", coalfacesafetyapplication.class, args);
}
完成以上四步即可,启动后,会自动解密配置信息。
加密工具类
在第三步使用的加密信息,需要工具类生成,代码如下:
package org.springblade.coalface.utils;
import org.jasypt.encryption.stringencryptor;
import org.jasypt.encryption.pbe.pooledpbestringencryptor;
import org.jasypt.encryption.pbe.config.pbeconfig;
import org.jasypt.encryption.pbe.config.simplestringpbeconfig;
public class jasyptutils {
/**
* {@link stringencryptor} 加解密。
* 同一个密钥(secretkey)对同一个内容执行加密,生成的密文都是不一样的,但是根据根据这些密文解密成明文都是可以.
* 1、jasypt 默认使用 {@link stringencryptor} 来解密全局配置文件中的属性,所以提供密文时,也需要提供 {@link stringencryptor} 加密的密文
* 2、{@link stringencryptor} 接口有很多的实现类,比如常用的 {@link pooledpbestringencryptor}
* 3、setconfig(final pbeconfig config):为对象设置 {@link pbeconfig} 配置对象
* 4、encrypt(final string message):加密内容
* 5、decrypt(final string encryptedmessage):解密内容
*
* @param secretkey :密钥。加/解密必须使用同一个密钥
* @param message :加/解密的内容
* @param isencrypt :true 表示加密、false 表示解密
* @return
*/
public static string stringencryptor(string secretkey, string message, boolean isencrypt) {
pooledpbestringencryptor pooledpbestringencryptor = new pooledpbestringencryptor();
pooledpbestringencryptor.setconfig(getsimplestringpbeconfig(secretkey));
string result = isencrypt ? pooledpbestringencryptor.encrypt(message) : pooledpbestringencryptor.decrypt(message);
return result;
}
/**
* 设置 {@link pbeconfig} 配置对象,simplestringpbeconfig 是它的实现类
* 1、所有的配置项建议与全局配置文件中的配置项保持一致,特别是 password、algorithm 等等选项,如果不一致,则应用启动时解密失败而报错.
* 2、setpassword(final string password):设置加密密钥,必须与全局配置文件中配置的保存一致,否则应用启动时会解密失败而报错.
* 3、setpoolsize(final string poolsize):设置要创建的加密程序池的大小.
* 4、setalgorithm(final string algorithm): 设置加密算法的值, 此算法必须由 jce 提供程序支持
* 5、setkeyobtentioniterations: 设置应用于获取加密密钥的哈希迭代次数。
* 6、setprovidername(final string providername):设置要请求加密算法的安全提供程序的名称
* 7、setsaltgeneratorclassname:设置 sal 发生器
* 8、setivgeneratorclassname:设置 iv 发生器
* 9、setstringoutputtype:设置字符串输出的编码形式。可用的编码类型有 base64、hexadecimal
*
* @param secretkey
* @return
*/
private static simplestringpbeconfig getsimplestringpbeconfig(string secretkey) {
simplestringpbeconfig config = new simplestringpbeconfig();
config.setpassword(secretkey);
config.setpoolsize("1");
config.setalgorithm("pbewithmd5anddes");
config.setkeyobtentioniterations("1000");
config.setprovidername("sunjce");
config.setsaltgeneratorclassname("org.jasypt.salt.randomsaltgenerator");
config.setivgeneratorclassname("org.jasypt.iv.randomivgenerator");
config.setstringoutputtype("base64");
return config;
}
public static void main(string[] args) throws exception {
string message = "@5rd!tc2cba";
string password = "tarzan";
//一个同样的密码和秘钥,每次执行加密,密文都是不一样的。但是解密是没问题的。
string jasyptencrypt = stringencryptor(password, message, true);
system.out.println(jasyptencrypt);
string jasyptencrypt1 = stringencryptor(password, jasyptencrypt, false);
system.out.println(jasyptencrypt1);
}
}
修改主方法中的message和password 即可。message为需要加密的文本,password 是加密盐值。
当然你也可以讲加密方法封装成接口调用,示例代码如下:
@resource
private stringencryptor stringencryptor;
/**
* http://localhost:8080/jasypt/encryptor?message=12日下午17点执行任务&isencrypt=true
* http://localhost:8080/jasypt/encryptor?message=702eaa3755766c567f62e83273681a90dc684b6afadd5cd84691778daf4a1466e13ce0720e8babc06081a5d6dbd90ea1&isencrypt=false
* 在线使用 {@link stringencryptor} 加解密消息。
*
* @param message 加/解密的内容
* @param isencrypt true 表示加密、false 表示解密
* @return
*/
@getmapping("jasypt/encryptor")
public objectnode encrypt(@requestparam string message, @requestparam boolean isencrypt) {
jsonnodefactory nodefactory = jsonnodefactory.instance;
string encrypt = isencrypt ? stringencryptor.encrypt(message) : stringencryptor.decrypt(message);
objectnode objectnode = nodefactory.objectnode();
objectnode.put("code", 200);
objectnode.put("data", encrypt);
return objectnode;
}
到此这篇关于springboot保护配置文件中敏感信息的保姆级教程的文章就介绍到这了,更多相关springboot保护配置文件敏感信息内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论