作者:追梦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项目配置文件中密码的加密的更多相关文章

  1. springboot读取配置文件中的信息

    在一个项目中,我们有时候会把一些配置信息写入到一个配置文件中,在java代码中读取配置文件的信息.在此记录下读取属性文件中的内容. 在springboot项目中,springboot的配置文件可以使用 ...

  2. 关于IBatisNet的配置文件中数据库连接字符串加密处理

    我们通常在IBatisNet配置文件 properties.config 加入数据库连接字符串.数据库连接字符串直接放在里面,没有被加密,很不安全.如果我们把 properties.config 文件 ...

  3. linux的PAM认证和shadow文件中密码的加密方式

    它是一种统一的认证方案.PAM 让您能随时改变您的认证方法以及需求,并且不需要重新编译任何代码就封装了所有本地认证方法.具体见 PAM 网站. 对于 PAM 您只需要做: 对您的密码采用不同于 DES ...

  4. shadow文件中密码的加密方式

    1) 查看shadow文件的内容 cat /etc/shadow 可以得到shadow文件的内容,限于篇幅,我们举例说明: root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF ...

  5. springboot项目yml中使用中文注释报错的解决方法1

    启动springboot项目时报错:/application.yml.....这大致就是说application.yml有问题,那么目前我所知道的大致两种情况会报错,第一种是yml格式有问题,要注意缩 ...

  6. Intelij IDEA创建SpringBoot项目 - 配置文件的解释

    springboot介绍 官网:spring.io Spring Boot is designed to get you up and running as quickly as possible, ...

  7. springBoot项目mybatis中加入缓存

    1:maven: <!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache-core --> <dependenc ...

  8. IDEA Intellij 打开springboot项目 配置文件无法出现输入提示

    需要将java代码和资源文件进行标记

  9. springboot获取配置文件中的内容

    代码: GrilApplication.java @SpringBootApplication public class GrilApplication { public static void ma ...

随机推荐

  1. java文件上传工具包

    java 文件上传工具包 主要有两个方法:单文件上传和多文件上传 @Slf4j public class UploadFileUtil { //上传单张图片 public String uploadP ...

  2. Windows 11 正式版 Build 22000.194 官方简体中文版、英文版(消费者版、商业版)下载

    昨天阿三正式发布了 Windows 11,版本号竟然是 22000.194,也就是 9 月 16 日的 测试版 22000.194,仅仅是文件改了个名,特别是消费者版本 hash 校验都是一致的. W ...

  3. 浅谈机(J)惨(C)技巧——从入门到精通(?)

    JC总是无聊的机房中有意思的一个瞬间... 比如: 这个杰作由 ZSWBWYX 完成 你认为这只是AK-IOI吗?不!注意用户名...也是此人的杰作. 所以,在险恶的机房里,一定要保护好自己的账号. ...

  4. 题解 [ZJOI2019]语言

    题目传送门 题目大意 给出一个 \(n\) 个点的树,现在有 \(m\) 次操作,每次可以选择一个链 \(s,t\),,然后这条链上每个点都会增加一个相同属性,问对于每一个点有与它相同属性的有多少个点 ...

  5. Markdown数学公式

    1. 显示位置与大小 正文(inline)中的LaTeX公式用$...$定义, 显示在当前行内. $\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$ \(\sum_{i ...

  6. SpringMVC 获得请求数据

    获得请求参数 客户端请求参数的格式是:name=value&name=value- - 服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数: 基本类型 ...

  7. PTA实验4-2-3 验证“哥德巴赫猜想” (20分)

    实验4-2-3 验证"哥德巴赫猜想" (20分) 数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两个素数之和.比如:24=5+19, ...

  8. Kali Linux修改root密码

    今天在官网下载了一个Kali虚拟机的压缩包, 解压缩后直接在VM中打开,点了好多次打开发现都打不开,查了一下说是没有关闭共享虚拟机,于是操作了一番: 编辑→首选项→共享虚拟机→选择禁用. 操作完之后果 ...

  9. 【UE4 C++】调用外部链接库 lib静态库

    简述 本例以插件形式测试 使用Lib引用,打包程序运行不用再拷贝lib文件 需要 lib 文件和 .h 头文件 lib部分的代码 .h 头文件 #pragma once #ifndef __MYTES ...

  10. [no code][scrum meeting] Beta 10

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月25日15:00,主持者:伦泽标 下次例会时间:5月26日11:30,主持者: 一.工作汇报 ...