SpringBoot项目配置文件中密码的加密
作者:追梦1819
原文:https://www.cnblogs.com/yanfei1819/p/15565862.html
版权声明:本文为博主原创文章,转载请附上博文链接!
公众号:追梦1819
前言
项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。
配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文件经手的(运维)人员可能很多,也可能是多方的(甲方、乙方甚至第三方)。本文讲述基于 SpringBoot 项目对配置文件中的密码进行加密。
本文实例中密码加密主要用到的是 Jasypt,一个Java的加解密库。
加密步骤
1、在项目中引入以下依赖。
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>1.18</version>
</dependency>
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt</artifactId>
<version>1.9.2</version>
</dependency>
2、在application.yml
文件中添加以下配置信息。
# 配置文件密码加密配置
jasypt:
encryptor:
password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7 # 秘钥
algorithm: PBEWithMD5AndDES # 加密算法
iv-generator-classname: org.jasypt.iv.NoIvGenerator
(1)从
3.0.0jasypt-spring-boot
版本开始,默认的加密/解密算法已更改为PBEWITHHMACSHA512ANDAES_256
;3.0.0以下版本默认为PBEWithMD5AndDES
;(2)上述
algorithm
不配置的话,其默认的秘钥也是PBEWithMD5AndDES
;(3)以上的
jasypt.encryptor.password
并不是很多人理解的salt
(盐),这是加密密钥。代码中的salt是随机生成的,长度默认为8位,生成类默认是org.jasypt.salt.RandomSaltGenerator
,可以通过配置jasypt.encryptor.salt-generator-classname
来修改。
3、通过命令获取密文。
java -cp /Users/shiyanfei/zlb/repository/repository-zlb/org/jasypt/jasypt/1.9.2/jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="Mysql@1234" password=idss@2021 algorithm=PBEWithMD5AndDES
终端执行上述命令会生成密文,其中:
/Users/shiyanfei/zlb/repository/repository-zlb/org/jasypt/jasypt/1.9.2/
是jasypt-1.9.2.jar
的路径(Linux环境中应该是在/lib包下面),根据需求修改;- input 是明文密码,每一个密码都需要执行一次;
- password 是秘钥。
4、修改原来的密码配置
原来的明文密码值,改为
ENC(xxx)
,其中xxx是密文。
例如:
1)MySQL
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/ueba?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
username: root
password: ENC(2RP1Vdsa+2wdSOgu2biAJkTCU9fnkUGD)
2)Redis
spring:
redis:
database: 0
host: 10.20.24.48
port: 6379
password: ENC(JjPTg5GOsjV9ZBIQ2CaHr+96UgMKBgIT)
5、添加注解
启动类上添加@EnableEncryptableProperties
。
思考:以上的步骤中,根据 Jasypt 的用法,基本上完成了对配置文件中密码的加密。但是,请思考一下,这样处理是否真的安全合理?
优化
如果按照严格的要求来,这样处理并不是完善的。因为秘钥和密文都暴露出来,依然是不安全的。那么,要如何处理呢?以下是我其中的一个思路,并已在项目中实践。
1、首先,秘钥通过另一个小工具生成,该小工具与项目无关;
小工具是一个独立的完整程序,有打包脚本和启停脚本。篇幅所限,已将源码上传至 GitHub。
2、其次,秘钥不暴露在配置文件中,而写入代码中(正常情况下,秘钥基本不会变动);
/************************ CHANGE REPORT HISTORY ******************************\
** Product VERSION,UPDATED BY,UPDATE DATE *
* DESCRIPTION OF CHANGE: modify(M),add(+),del(-) *
*-----------------------------------------------------------------------------*
* V3.0.12,shiyanfei,2021-09-14
* create
*
*************************** END OF CHANGE REPORT HISTORY ********************/
package com.idss.radar.common.ums.bean;
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;
/**
* @author : shiyanfei
* @description : <p>自动配置加密信息</p>
* @see : com.idss.radar.common.ums.bean
* @since : 2021-09-14
*/
@Configuration
public class EncryptorConfig {
@Bean("jasyptStringEncryptor")
public StringEncryptor jasyptStringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("EbfYkitulv73I2p0mXI50JMXoaxZTKJ7");
// 注释部分为配置默认
config.setAlgorithm("PBEWithMD5AndDES");
// config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
// config.setProviderName("SunJCE");
// config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
// config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
// config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
3、删除配置文件中的信息
# 配置文件密码加密配置
jasypt:
encryptor:
password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7 # 秘钥
algorithm: PBEWithMD5AndDES # 加密算法
iv-generator-classname: org.jasypt.iv.NoIvGenerator
4、以上处理还有一个好处,就是优化后的项目,既支持明文,也支持密文,密文只要加函数 ENC(xxxx)
。
总结
解决问题的方案没有最好的,只有更好的。随着要求的不断提高,思考的不断深入,解决问题的方案才会逐步趋近完美。
SpringBoot项目配置文件中密码的加密的更多相关文章
- springboot读取配置文件中的信息
在一个项目中,我们有时候会把一些配置信息写入到一个配置文件中,在java代码中读取配置文件的信息.在此记录下读取属性文件中的内容. 在springboot项目中,springboot的配置文件可以使用 ...
- 关于IBatisNet的配置文件中数据库连接字符串加密处理
我们通常在IBatisNet配置文件 properties.config 加入数据库连接字符串.数据库连接字符串直接放在里面,没有被加密,很不安全.如果我们把 properties.config 文件 ...
- linux的PAM认证和shadow文件中密码的加密方式
它是一种统一的认证方案.PAM 让您能随时改变您的认证方法以及需求,并且不需要重新编译任何代码就封装了所有本地认证方法.具体见 PAM 网站. 对于 PAM 您只需要做: 对您的密码采用不同于 DES ...
- shadow文件中密码的加密方式
1) 查看shadow文件的内容 cat /etc/shadow 可以得到shadow文件的内容,限于篇幅,我们举例说明: root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF ...
- springboot项目yml中使用中文注释报错的解决方法1
启动springboot项目时报错:/application.yml.....这大致就是说application.yml有问题,那么目前我所知道的大致两种情况会报错,第一种是yml格式有问题,要注意缩 ...
- Intelij IDEA创建SpringBoot项目 - 配置文件的解释
springboot介绍 官网:spring.io Spring Boot is designed to get you up and running as quickly as possible, ...
- springBoot项目mybatis中加入缓存
1:maven: <!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache-core --> <dependenc ...
- IDEA Intellij 打开springboot项目 配置文件无法出现输入提示
需要将java代码和资源文件进行标记
- springboot获取配置文件中的内容
代码: GrilApplication.java @SpringBootApplication public class GrilApplication { public static void ma ...
随机推荐
- vue+element实现省区市三级联动以及详细地址的输入
Vue+elementui实现省区市三级联动+详细地址的输入 详细需求,需要手动更改用户所在的地址. 安装依赖项 npm install element-china-area-data -S 在组建中 ...
- 从源码解析Electron的安装为什么这么慢
前言 Electron作为一款跨平台的桌面应用端解决方案已经风靡全球.作为开发者,我们几乎不用关心与操作系统的交互,直接通过Web前端技术与Electron提供的API就可以完成桌面应用端的开发. 然 ...
- python中return的返回和执行
1 打印函数名和打印函数的执行过程的区别 例子1.1 def a(): print(111) print(a) # 打印a函数的内存地址,不会对a函数有影响,a函数不会执行 print(a()) # ...
- css单位px,em,rem区别
在css中单位长度用的最多的是px.em.rem,这三个的区别是: px是固定的像素,一旦设置了就无法因为适应页面大小而改变. em和rem相对于px更具有灵活性,他们是相对长度单位,意思是长度不是定 ...
- 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
- [技术博客]Unity3d 动画控制
在制作游戏时,导入的箱子模型本身自带动画.然而,它的动画是一个从打开到关闭的完整过程,并且没有给出控制打开关闭的方法. 最直接的想法是对该动画进行拆分,再封装成不同的动画状态,但是不巧的是,这个动画被 ...
- OO_JAVA_四个单元的总结
总结本单元两次作业的架构设计 设计目标 尽量减少特殊容器的存在,能通用就通用,减少重复的类同代码. 基础容器的存在,就是为上述目标而服务的. 设计概要 底层:基础的.类型无关.无依赖的容器以及对应的查 ...
- window系统上实现mongodb副本集的搭建
一.问题引出 假设我们生产上的mongodb是单实例在跑,如果此时发生网络发生问题或服务器上的硬盘发生了损坏,那么这个时候我们的mongodb就使用不了.此时我们就需要我们的mongodb实现高可用, ...
- 关于qmake的install
在pro的构建系统中可以设置INSTALLS变量,在make命令之后,执行make install命令触发,将想要的资源拷贝到相应的目录,参考qwt的构建体系,在qwt.pro末尾有这么几句 qwts ...
- 洛谷 P2680 [NOIP2015 提高组] 运输计划
链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...