千家信息网

Java中如何给数据库加密配置项

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要讲解了"Java中如何给数据库加密配置项",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java中如何给数据库加密配置项"吧!先看一份典型的
千家信息网最后更新 2025年02月01日Java中如何给数据库加密配置项

这篇文章主要讲解了"Java中如何给数据库加密配置项",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java中如何给数据库加密配置项"吧!

先看一份典型的配置文件

... 省略 ...

## 配置MySQL数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://121.196.xxx.xxx:3306/user?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

## 配置Redis缓存连接
redis.host=121.196.xxx.xxx
redis.port=6379
redis.password=111111

## 配置SMS短信服务连接
ali.sms.access_key_id=2zHmLdxAes7Bbe2w
ali.sms.access_key_secret=bImWdv6iy0him8ly

... 省略 ...

这是节选自某个典型的Spring Boot项目的application.properties配置文件。

嘘… 偷偷告诉我,是不是很多小伙伴也都是这么写的?

这乍一看没啥问题,很多人会觉得理所当然。包括我自己也看到过很多的项目(包括很多开源项目)是这么写的。

但仔细一琢磨,发现:

是的! 很多项目的配置文件里,包括数据库密码、缓存密码、亦或是一些第三方服务的Key都是直接配在里面,没有做任何加密处理!

有人会说这个配置文件反正是我自己的,有啥风险?

这个嘛,之前倒是看到过一个例子,一个程序员把自己公司的项目代码上传到了自己的GitHub仓库里了,结果配置文件忘了处理,导致公司数据库泄露,关键问题是,这个公司还是个酒店管理公司,因此后果可想而知了…

换个角度想,假如当时那个项目的配置文件里,所有重要信息都经过了加密,那这一幕大概率就不会发生了。所以,即使是项目的配置文件,重要的信息也得加密!


哪些信息要加密呢?

一般来说,项目配置文件里,所有涉及信息安全的配置项(或字段)都应该做处理,典型的比如:

  • 用到的数据库、缓存的密码

  • 用到的中间件、消息队列的密码

  • 用到的各种第三方服务的Access_Key

  • 其他第三方服务的通信信息

  • …等等

总而言之,关键字段都应该保护起来,最起码不能用明文直接写在配置文件里!


如何加密配置项呢?

方法非常简单,几个步骤即可完成,先来演示一个最简版本:

1、首先建立一个基础的Spring Boot工程

这就不再赘述了

2、引入jasypt-spring-boot加密组件

通过jasypt-spring-boot这个开箱即用的加密组件来引入Jasypt这个强大的加密库


com.github.ulisesbocchio
jasypt-spring-boot-starter
3.0.2

3、配置加密密钥

在Spring Boot的项目配置文件application.properties里新增如下配置:

jasypt.encryptor.password=CodeSheep

可以理解为jasypt会使用这个自定义加密密钥,对配置文件里的重要项进行加密。

4、加密测试

为了便于测试,我们直接扩展Spring Boot项目的启动类,项目启动时执行加密测试代码,直接看效果

@SpringBootApplication
public class SpringBootConfigEncryptApplication implements CommandLineRunner {

@Autowired
private ApplicationContext appCtx;

@Autowired
private StringEncryptor codeSheepEncryptorBean;

public static void main(String[] args) {
SpringApplication.run(SpringBootConfigEncryptApplication.class, args);
}

@Override
public void run(String... args) throws Exception {

Environment environment = appCtx.getBean(Environment.class);

// 首先获取配置文件里的原始明文信息
String mysqlOriginPswd = environment.getProperty("spring.datasource.password");
String redisOriginPswd = environment.getProperty("redis.password");
String aliSmsOriginAk = environment.getProperty("ali.sms.access_key_secret");

// 加密
String mysqlEncryptedPswd = encrypt( mysqlOriginPswd );
String redisEncryptedPswd = encrypt( redisOriginPswd );
String aliSmsEncryptedAk = encrypt( aliSmsOriginAk );

// 打印加密前后的结果对比
System.out.println( "MySQL原始明文密码为:" + mysqlOriginPswd );
System.out.println( "Redis原始明文密码为:" + redisOriginPswd );
System.out.println( "阿里云SMS原始AccessKey密码为:" + aliSmsOriginAk );
System.out.println( "====================================" );
System.out.println( "MySQL原始明文密码加密后的结果为:" + mysqlEncryptedPswd );
System.out.println( "Redis原始明文密码加密后的结果为:" + redisEncryptedPswd );
System.out.println( "阿里云SMS原始AccessKey密码加密后的结果为:" + aliSmsEncryptedAk );
}

private String encrypt( String originPassord ) {
String encryptStr = codeSheepEncryptorBean.encrypt( originPassord );
return encryptStr;
}

private String decrypt( String encryptedPassword ) {
String decryptStr = codeSheepEncryptorBean.decrypt( encryptedPassword );
return decryptStr;
}
}

运行项目,控制台打印:

MySQL原始明文密码为:123456
Redis原始明文密码为:111111
阿里云SMS原始AccessKey密码为:bImWdv13da894mly
====================================
MySQL原始明文密码加密后的结果为:IV7SyeQOfG4GhiXeGLboVgOLPDO+dJMDoOdmEOQp3KyVjruI+dKKeehsTriWPKbo
Redis原始明文密码加密后的结果为:litUkxJ3fN6+//Emq3vZ+y4o7ZOnZ8doOy7NrgJIDLoNWGG0m3ygGeQh/dEroKvv
阿里云SMS原始AccessKey密码加密后的结果为:MAhrOs20DY0RU/c1IKyLCt6dWZqLLOO4wUcK9GBgSxNII3C+y+SRptors+FyNz55xNDslhDnpWllhcYPwZsO5A==

5、修改配置文件,替换待加密配置项

我们拿到上一步得到的加密结果,将配置文件中的原始明文密码替换成上一步对应的结果即可,就像这样:

所以墙裂建议配置文件里的所有重要信息都这样处理!

6、查看密码解密结果

@SpringBootApplication
public class SpringBootConfigEncryptApplication implements CommandLineRunner {

@Autowired
private ApplicationContext appCtx;

@Autowired
private StringEncryptor codeSheepEncryptorBean;

public static void main(String[] args) {
SpringApplication.run(SpringBootConfigEncryptApplication.class, args);
}

@Override
public void run(String... args) throws Exception {

Environment environment = appCtx.getBean(Environment.class);

// 首先获取配置文件里的配置项
String mysqlOriginPswd = environment.getProperty("spring.datasource.password");
String redisOriginPswd = environment.getProperty("redis.password");
String aliSmsOriginAk = environment.getProperty("ali.sms.access_key_secret");

// 打印解密后的结果
System.out.println( "MySQL原始明文密码为:" + mysqlOriginPswd );
System.out.println( "Redis原始明文密码为:" + redisOriginPswd );
System.out.println( "阿里云SMS原始AccessKey密码为:" + aliSmsOriginAk );
}
}

打印结果:

MySQL原始明文密码为:123456
Redis原始明文密码为:111111
阿里云SMS原始AccessKey密码为:bImWdv13da894mly

很明显,在代码中使用时,jasypt-spring-boot组件会自动将ENC()语法包裹的配置项加密字段自动解密,数据得以还原。


小朋友,你是否有很多问号?

这时候我想肯定很多小伙伴表示疑惑,典型的比如:

1、加密密钥必须放在ENC()中?为什么是ENC?

2、虽然说原始涉及信息安全的配置项被加密,但是自定义的加密密钥jasypt.encryptor.password=CodeSheep假如泄露了,别人不还是有几率可以解密的吗?

针对这些问题,继续往下看。


自定义加密前后缀

如果不愿意使用jasypt默认提供的ENC来标记加密字段,完全可以换成自定义的前后缀标记,比如我想换成CodeSheep()来标记加密字段,此时只需要在配置文件里配置一下前后缀即可:

jasypt.encryptor.property.prefix=CodeSheep(
jasypt.encryptor.property.suffix=)

这时候加密字段就可以放在CodeSheep()标记的字段中:


让加密更安全

虽然经过上文的加密,涉及信息安全的配置项肯定会变得更安全,这个毋庸置疑!

但是假如配置文件里的自定义加密密钥jasypt.encryptor.password=CodeSheep泄露了,那我们的加密字段也还是有可能被别人解密,为此,有几项工作可以让加密变得更加安全。

1、使用自定义加密器

上文实验加密时,使用的是默认的加密规则,这一点会让当自定义加密密钥泄漏时可能变得不安全。为此我们可以自定义加密规则。

自定义加密规则非常简单,只需要提供自定义的加密器配置类即可,比如我这里自定义一个名为 codeSheepEncryptorBean类型的加密器:

@Configuration
public class CodeSheepEncryptorCfg {

@Bean( name = "codeSheepEncryptorBean" )
public StringEncryptor codesheepStringEncryptor() {

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();

SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("CodeSheep");
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
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;
}
}

注意这里Bean的名字name是需要显式指定的(默认的名字是jasyptStringEncryptor),如果像这里一样用的自定义名字,则还需要在Spring Boot的application.properties配置文件中来指定bean的名字,就像这样:

jasypt.encryptor.bean=codeSheepEncryptorBean

2、加密密钥不要写在配置文件中

如果觉得上面这种方式还是可能会导致加密密钥泄露的话(毕竟还是写在了配置文件中),那我们干脆可以直接将加密密钥从配置文件中拿掉,取而代之的有三种方式:

  • 方式一:直接作为程序启动时的命令行参数来带入

java -jar yourproject.jar --jasypt.encryptor.password=CodeSheep
  • 方式二:直接作为程序启动时的应用环境变量来带入

java -Djasypt.encryptor.password=CodeSheep -jar yourproject.jar
  • 方式三:甚至可以作为系统环境变量的方式来带入

比方说,我们提前设置好系统环境变量JASYPT_ENCRYPTOR_PASSWORD = CodeSheep,则直接在Spring Boot的项目配置文件中做如下配置即可:

jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}

感谢各位的阅读,以上就是"Java中如何给数据库加密配置项"的内容了,经过本文的学习后,相信大家对Java中如何给数据库加密配置项这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

加密 配置 密码 文件 原始 明文 结果 项目 数据 信息 密钥 数据库 字段 安全 方式 阿里 还是 重要 公司 典型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河北诚信网络技术开发口碑推荐 数据库连接池大小配置 服务器低功耗 怎么看对峙2服务器正在维护中 大兴区专业软件开发包括什么 万全t350g7服务器价格 闵行区进口网络技术服务源头好货 网站的服务器是怎么防护的 堡垒之夜手游服务器进不去 软件开发哪些行业最好 网络安全法第一条讲的市 曙光服务器售后电话 数据库商品评论表作用 万云网络技术有限公司靠谱吗 app直播软件开发要学多久 为什么电话号码无法连接服务器 软件服务器和后台安全性 海德软件数据库 负责软件开发的是什么部门 网络安全专题网 视频 河北诚信网络技术开发口碑推荐 vpn服务器ip地址 华为云服务器成都区域选择 奇迹暖暖用什么软件开发的 剑灵自由服务器 医疗软件开发定制 软件开发工程师岗位简介 网剑数据库综合管理系统 无线网络技术教程 下载 方舟手游服务器一年要多少钱
0