摘要:配置文件密码加密配置秘钥加密算法从版本开始,默认的加密解密算法已更改为以下版本默认为上述不配置的话,其默认的秘钥也是以上的并不是很多人理解的盐,这是加密密钥。思考以上的步骤中,根据的用法,基本上完成了对配置文件中密码的加密。
作者:追梦1819
原文:https://www.cnblogs.com/yanfei1819/p/15565862.html
版权声明:本文为博主原创文章,转载请附上博文链接!
公众号:追梦1819
项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。
配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文件经手的(运维)人员可能很多,也可能是多方的(甲方、乙方甚至第三方)。本文讲述基于 SpringBoot 项目对配置文件中的密码进行加密。
本文实例中密码加密主要用到的是 Jasypt,一个Java的加解密库。
1、在项目中引入以下依赖。
com.github.ulisesbocchio jasypt-spring-boot 1.18 org.jasypt jasypt 1.9.2
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包下面),根据需求修改;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 : 自动配置加密信息
* @see : com.idss.radar.common.ums.bean * @since : 2021-09-14 */@Configurationpublic 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)
。
解决问题的方案没有最好的,只有更好的。随着要求的不断提高,思考的不断深入,解决问题的方案才会逐步趋近完美。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123638.html
摘要:所以这里我们就需要对数据库的用户名和密码进行加密,这也是本文的由来。本文采用对配置文件加密的相关方法,其实呢,也还有其他方案,具体的会在后面的相关文章中说明。 前言 在日前安全形势越来越严重的情况下,让我意识到在项目中存在一个我们经常忽略的漏洞,那就是我们的项目的配置文件中配置信息的安全,尤其是数据库连接的用户名和密码的安全。所以这里我们就需要对数据库的用户名和密码进行加密,这也是本文...
摘要:通过购买免费的证书购买地址详细操作请点击免费申请阿里云赛门企业级铁克证书在上面配置我们现在这里只讲解在阿里云下购买的证书进行配置,现在都有了证书,现在我们来配置。 最近项目中的网站要设置https,虽然进入软件行业6年了,配置这个还是显得信心不足,还好网上有好多网友分享的文章可以从中学习,但是有优也有劣,凭我自己的一点经验从中甄选出好一点的文章跟大家分享一下。 1、什么是Https? ...
摘要:这里使用的是数据库启动类上加上注解在启动类中添加对包扫描扫描多个包下的可以有以下几种方法扫描会自动加载相关配置,数据源就会自动注入到中,会自动注入到中,可以直接使用。有配置文件下的使用扫描多个包下的可以有以下几种方法扫描 Spring-Boot 学习笔记 1 Spring-Boot 介绍 1.1 什么是Spring-Boot Spring-Boot是由Pivotal团队提供的全新框架...
阅读 2483·2023-04-25 22:09
阅读 988·2021-11-17 17:01
阅读 1441·2021-09-04 16:45
阅读 2565·2021-08-03 14:02
阅读 754·2019-08-29 17:11
阅读 3231·2019-08-29 12:23
阅读 1060·2019-08-29 11:10
阅读 3253·2019-08-26 13:48