springboot 数据库配置信息加密处理 20251988编辑

Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注

springboot 数据库配置信息加密处理

Created by Marydon on 2022-01-07 19:07

1.情景展示

在项目开发过程中,为了便于对数据库进行管理,我们通常会将数据库相关配置放到配置文件当中;例如:

由于这里实际配置的就是用户名和密码等信息,具有安全隐患,如果在实际部署web项目时,项目部署地址不是在本公司的话,那别的人员就能通过部署路径找到项目,进而找到数据库地址,用户名,密码信息,他们就可以通过这台服务器去直接连数据库,这样数据库的数据将不再具有隐蔽性,将会导致信息泄露。

如何解决这个问题?

2.原因分析

可通过jasypt,大致过程就是:在项目加载配置文件的加密信息时,jasypt会对加密信息进行解密。

在初始化数据源时,优先执行解密代码;

所用算法:PBEWithMD5AndDES;

盐生成器类名:org.jasypt.salt.RandomSaltGenerator;

看这架势,可以通过配置jasyptStringEncryptor类,来对加密算法等进行自定义管理(有兴趣可以试下,我没进行)。

3.解决方案

本文将以数据库的连接地址、用户名和密码的加密为例进行介绍。

第一步:导包;

<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>

将其添加到pom.xml文件当中。

第二步:配置加/解的密码;

# jasypt加密的密匙
jasypt:
encryptor:
password: Y6M9fAJQdU7jNp5MW

将其添加到application.xml文件当中。

第三步:根据明文生成密文;

由于需要用到StringEncryptor.java,我以为它是一个实体类,没想到它是一个接口。

错误示例:

它只能在项目启动后,才知道最终需要调用的是哪个加密工具类。

正确示例:

查看代码
import org.jasypt.encryption.StringEncryptor;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
/**
* 数据库加密测试类
* @description:
* @author: Marydon
* @date: 2022-01-07 16:35
* @version: 1.0
* @email: marydon20170307@163.com
*/
@SpringBootTest
public class DataBaseEncryptorTest {
@Resource
private StringEncryptor encryptor;
@Test
public void getPass() {
String url_clear_text = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai";
String url_cipher_text = encryptor.encrypt(url_clear_text);
String name_clear_text = "root";
String name_cipher_text = encryptor.encrypt(name_clear_text);
String password_clear_text = "123456";
String password_cipher_text = encryptor.encrypt(password_clear_text);
System.out.println("-------------------输出加密结果-------------------");
System.out.println("database url: " + url_cipher_text);
System.out.println("database name: " + name_cipher_text);
System.out.println("database password: " + password_cipher_text);
}
}

新建一个java类型,将上述代码复制进去即可; 

运行该类,等待执行结果即可。

 

这样,要想获得密文,只需将按照这一步操作即可;

同样地,如果我们哪天想要知道明文信息,就可以通过这种方式进行解密。

第四步:将加密后的字符串替换原明文。

注意: 上面的 ENC(密文) 是固定写法,这样,jasypt才会进行解密。

4.扩展

我们可以看到,上面那种方式,虽然数据库的配置使用了密文,但是,还是不够安全,因为我们把解密密码暴露在了application.yml文件当中,如果规避这种问题呢?

JAR包部署

为了防止salt(盐)泄露,反解出密码,可以在项目部署的时候使用命令传入salt(盐)值:

java -jar xxx.jar -Djasypt.encryptor.password=Y6M9fAJQdU7jNp5MW

或者将密码配置在服务器的环境变量里。

Linux部署

打开/etc/profile文件;

vim /etc/profile

在profile文件末尾插入salt(盐)变量;

export JASYPT_PASSWORD = Y6M9fAJQdU7jNp5MW

编译,使配置文件生效;

source /etc/profile

运行:

java -jar -Djasypt.encryptor.password=${JASYPT_PASSWORD} xxx.jar

5.触类旁通

同样地,对于非SPRINGBOOT项目,我们也可以将加密结果放到配置文件当中,难点在于:

如何在初始化数据源前完成对密文进行解密,并让数据库驱动拿到解密后的明文。

另外,如果配置文件配置了其它的IP地址,可以使用java将IP4转成long类型,取值的时候,再将其转成IP4,也可以提高安全性。

2022年2月26日13:48:49

druid本身支持对数据库的密码进行加密,非springboot项目,可以使用这个;

具体实现,见文末推荐。

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。

您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!

↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓

posted @   Marydon  阅读(1988)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
sorry,本博客所有代码禁止复制,原创代码需扫码支付方可获取!
关闭

1、先加好友再付费,点我加好友;

2、代码不能满足你的需求?加好友付费定制你的专属代码!

3、付费标准及方式,点我查看详情。