简介:java系列技术分享(持续更新中…)
初衷:一起学习、一起进步、坚持不懈
如果文章内容有误与您的想法不一致,欢迎大家在评论区指正
希望这篇文章对你有所帮助,欢迎点赞 收藏 ⭐留言
密码配置项都不加密?想啥呢?
一般来说,项目配置文件里,所有涉及信息安全的配置项都应该做处理,例如:
最起码不能用明文直接写在配置文件里!
<dependency>
<groupId>com.github.ulisesbocchiogroupId>
<artifactId>jasypt-spring-boot-starterartifactId>
<version>3.0.2version>
dependency>
jasypt:
encryptor:
password: Encrypt
jasypt
会使用这个自定义加密密钥
,对配置文件里的重要项进行加密
。
我们直接扩展Spring Boot项目的启动类,项目启动时执行加密测试代码
@Component
public class SpringBootConfigEncrypt implements CommandLineRunner {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private StringEncryptor encryptor;
@Override
public void run(String... args) throws Exception {
Environment environment = applicationContext.getBean(Environment.class);
// 首先获取配置文件里的原始明文信息
// 根据自己配置文件中的密码读取路径自行更改
String oldPassword = environment.getProperty("spring.datasource.dynamic.datasource.master.password");
// 加密
String encryptPassword = encrypt( oldPassword );
// 打印加密前后的结果对比
System.out.println( "MySQL原始明文密码为:" + oldPassword );
System.out.println( "====================================" );
System.out.println( "MySQL原始明文密码加密后的结果为:" + encryptPassword );
}
private String encrypt( String originPassord ) {
return encryptor.encrypt( originPassord );
}
private String decrypt( String encryptedPassword ) {
return encryptor.decrypt( encryptedPassword );
}
}
在代码中使用时,jasypt-spring-boot
组件会自动将ENC()
语法包裹的配置项加密字段自动解密,数据得以还原。
自定义的前后缀标记,比如我想换成CodeSheep()来标记加密字段,此时只需要在配置文件里配置一下前后缀即可:
jasypt:
encryptor:
property:
prefix: Code(
suffix: )
自定义加密密钥泄露,那我们的加密字段也还是有可能被别人解密,为此,
有几项工作可以让加密变得更加安全
。
上文实验加密时,使用的是默认的加密规则
,这一点会让当自定义加密密钥泄漏时可能变得不安全。为此我们可以自定义加密规则
。
@Configuration
public class CodeSheepEncryptorCfg {
@Bean
public StringEncryptor myEncryptStringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("Encrypt");
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
将加密测试代码的加密器进行修改
@Autowired注入原理
:
- 先按照类型进行注入
- 如果在Spring容器中存在同一个类型的多个bean,那么此时在进行注入的时候是
按照属性名称进行注入
如果觉得上面这种方式还是可能会导致加密密钥泄露的话,可以直接将加密密钥
从配置文件中拿掉,有三种方式
:
java -jar app.jar --jasypt.encryptor.password=Encrypt
java -Djasypt.encryptor.password=Encrypt -jar app.jar
登录环境和非登录环境读取配置文件的顺序是不一样的
,Shell脚本内容过多,不进行详细介绍,可以在
Linux Shell编程入门到实战(一)
Linux Shell编程入门到实战(二)
中有详细介绍自行学习
我们提前配置好
自定义全局环境变量
,则直接在Spring Boot的项目配置文件中做如下配置即可:
linux中
编辑/etc/profile全局配置文件
export JASYPT_ENCRYPTOR_PASSWORD = Encrypt
重载配置文件/etc/profile, 因为配置文件修改后要立刻加载里面的数据就需要重新加载
source /etc/profile
yml中
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD}
这时候也安全很多
加密工具类非常多,大家可以自行选择
这里列举其他两种:
public class JasyptUtil {
public static void main(String[] arg) {
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
/*配置文件中配置如下的算法*/
standardPBEStringEncryptor.setAlgorithm("PBEWithMD5AndDES");
/*配置文件中配置的password*/
standardPBEStringEncryptor.setPassword("Encrypt");
/*要加密的文本*/
String name = standardPBEStringEncryptor.encrypt("root");
String password = standardPBEStringEncryptor.encrypt("123456");
/*将加密的文本写到配置文件中*/
System.out.println("name=" + name);
System.out.println("password=" + password);
}
}
public class JasyptUtil {
public static void main(String[] args) {
String account = "root";
String password = "123456";
BasicTextEncryptor encryptor = new BasicTextEncryptor();
//秘钥
encryptor.setPassword("Encrypt");
//密码进行加密
String newAccount = encryptor.encrypt(account);
String newPassword = encryptor.encrypt(password);
System.out.println("加密后账号:" + newAccount);
System.out.println("加密后密码:" + newPassword);
}
}