首页 > 编程知识 正文

数据库加密存储,springboot密码加密

时间:2023-05-06 04:47:23 阅读:152217 作者:3265

作者|凉面

来源| Java中文社区(ID:javacn666 ) )。

转载请联系许可证(wechatid:gg_stone )

为什么要加密? 现在的开发习惯是,无论是公司项目还是个人项目,都选择将源代码上传到Git服务器(GitHub、Gitee或自制服务器),请参阅将源码提交到公网服务器就会存在源码泄漏的风险

于是为了避免这种问题的产生,我们至少要对数据库的密码进行加密操作这样,即使得到了源代码,也不会导致数据泄露,可以保护最后的遮羞布。

加密方法? 对于Java项目,要快速实现数据库加密,请参阅最简单可行的方案就是使用阿里巴巴提供的 Druid 来实现加密

什么是Druid? Druid (中文翻译为“德伊”)是开源Java语言不在场证明中最高的数据库连接池。 Druid提供了强大的监视和扩展功能,当然也包括数据库加密功能。

Druid开源地址: https://github.com/alibaba/druid/

Druid能做什么? Druid监视数据库访问的性能。 通过Druid内置的强大的StatFilter插件,可以详细统计SQL的执行性能,并有助于联机分析数据库访问性能。

替换数据库连接池DBCP和C3P0后,Druid提供了高效、强大且可扩展的数据库连接池。

加密数据库密码,直接将数据库密码写在配置文件中是不好的行为,容易引起安全问题。 druid驱动器和druid数据源都支持密码回调。

SQL执行日志、Druid提供了各种支持Common-Logging、Log4j和JdkLog的log过滤器。 如果需要,可以选择适当的LogFilter来监视APP应用程序的数据库访问情况。

扩展JDBC。 如果JDBC层有编程需求,可以使用Druid提供的过滤器- chain机制轻松为JDBC层创建扩展插件。

本文重点介绍了第三个特性,即使用Druid实现数据库密码加密。

加密的执行过程是在未进行密码加密之前,项目的交互过程如下。

使用密码加密时,项目的交互过程如下:

使用Druid加密此示例运行时环境:

Spring Boot 2.4.3

MySQL 5.7

Java 1.8

Idea 2020.1.3

添加依赖于Druid的Maven项目:

ependencygroupidcom.Alibaba/groupidartifactiddruid-spring-boot-starter/artifactidversion1.2.5/version/de peped

最新版本的compile ' com.Alibaba : druid-spring-boot-starter :1.2.5 ' druid:https://mvn repository.com/artifact

2 .添加要生成密文的Druid后,可以使用Druid提供的ConfigTools类加密密码。 实现代码如下。

import com.Alibaba.druid.filter.config.config tools; classmytests (publicstaticvoidmain (string [ ] args ) throwsexception )//需要加密的昏迷花瓣上Stringpassword='youPassword '; //【注意:在此更改为您自己的密码】调用druid以获取私钥、公钥和密文config tools.main (new string [ ] { password } ); }上述代码按如下方式执行:

private key : miibuwibadanbgkqhkig9w0 baqefaascat0wgge5ageaakeapojcmwsdzjikvgmtcboqptm9TV w2 H2 cns6xzk7nrbzqxywlqd2zefirx9vmvqqq

HTuUcUXHgCxu0cwIDAQABAkAlqo5ItdWo0Jqf5zdXJlg5p2yP4HCiqCYyfKzF+2s9KEmgWZJWTctZDsgQ0iYUohORR59I+J4nabhel1x5/INpAiEA6jwSyFqMUPOh1XlrzNFek+RthOQ5n4+ALPo+vULayO0CIQC0O7JM9sIq+tg+jCGv+ypk6vbuRKY9m5W2rSRXapGm3wIgRHul3jAjIDPrF/f1HaAFL+Y0Yws7Ebyp8/yCRWF7iA0CIALbe20q8FMcHPeI4zPWCIsHCpkmb3hEkjAOOKhGIT8DAiAqiUuz92NqKeyjmOfons1ka65EzVwA3NDhZ6+IQcnuig== publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKTo3DFkg8yYilRprXAQaED7TPbVVth9nJ0usWSuza280F2Fi0A9s3nyK68fbzL6kSBxKpJgB07lHFFx4AsbtHMCAwEAAQ== password:IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==

从上述结果可以看出,使用 ConfigTools 类会生成 3 部分的内容:

privateKey:私钥,暂时不会用到,用于密码的加密;

publicKey:公钥,用于密码的解密;

password:加密之后的密码。

PS:要实现数据库的加密,主要使用的是 publicKey(公钥)和 password(密文),这就把昏睡的花瓣转换成密文了。

3.添加配置

完成了以上操作之后,只需要将上一步生成的公钥密文添加到项目的配置文件 application.yml(或application.xml)中就实现了加密操作了,具体配置信息如下:

spring:  # MySQL 配置  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    type: com.alibaba.druid.pool.DruidDataSource    druid:      url: jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=Asia/Shanghai&fdzm=UTF-8&useSSL=false      username: root      password: IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==      # encrypt config      filters: config      connect-properties:        config.decrypt: true        config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKTo3DFkg8yYilRprXAQaED7TPbVVth9nJ0usWSuza280F2Fi0A9s3nyK68fbzL6kSBxKpJgB07lHFFx4AsbtHMCAwEAAQ==

其中 password 对应的是上一步生成的 password(密文),而 config.decrypt.key 对应的是上一步生成的 publicKey(公钥),如下图所示:

这里提供一个原始的配置文件,以便和加密后的配置文件进行比对:

4.注意事项-插着钥匙的锁

经过前面 3 步的配置之后,我们的程序就可以正常运行了,但这远没有结束!

在第 3 步配置时,我们将密文和公钥都写入配置文件,这就会造成当有人拿到密文和公钥之后,就可以使用 Druid 将加密的密码还原出来了,这就好比一把插着钥匙的锁是极不安全的。

因此我们正确的使用姿势:是将公钥找一个安全的地方保存起来,每次在项目启动时动态的将公钥设置到项目中,这样就可以有效的保证密码的安全了。

正确的配置文件

接下来我们将 Spring Boot 的公钥设置为配置项,在项目运行时再替换为具体的值,最终的安全配置信息如下:

spring:  # MySQL 配置  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    type: com.alibaba.druid.pool.DruidDataSource    druid:      url: jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=Asia/Shanghai&fdzm=UTF-8&useSSL=false      username: root      password: IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==      # encrypt config      filters: config      connect-properties:        config.decrypt: true        config.decrypt.key: ${spring.datasource.druid.publickey}

可以看出公钥被修改成“${spring.datasource.druid.publickey}”了,这就相当于使用占位符先把坑给占上,等项目启动时再更换上具体的值。

PS:“spring.datasource.druid.publickey”并非是固定不可变的 key,此 key 值用户可自行定义。

开发环境替换公钥

开发环境只需要在 Idea 的启动参数中配置公钥的值即可,如下图所示:

当我们输入正确的公钥值时程序可以正常运行,当输入一个错误的公钥值时就会提示解码失败,如下图所示:

生产环境替换公钥

生产环境在启动 jar 包时只需要动态设置公钥的值即可,参考以下命令:

java -jar xxx.jar --spring.datasource.druid.publickey=你的公钥

Druid运行原理

经过上述步骤之后,我们就完成 MySQL 密码的加密了,这样当 Spring Boot 项目启动时,Druid 的拦截器会使用密文和公钥将密码还原成真实的密码以供项目使用,当然这一切都无需人工干预(无需编写任何代码),Druid 已经帮我封装好了,我们只需要通过以上配置即可。

什么?你想知道 Druid 是如何通过密文和公钥还原出真实的密码的?

没问题,满足你,其实 ConfigTools 类中已经提供了相应实现,代码如下:

// 密文String password = "VwH1mu2IUpqjfKTd+gSikiZgJTi+3Y5zFIFRfxYnH1UqHzm1K8TIHnMaV3TErBaGsVEaGV0e63pb0Ys3Wdm7Kg==";// 公钥String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALWIEp19IM04sB+vQXnEOH9gFNFdL5TFGSEhORgHj4MnfTfBSNaOoSgCaM8BOpjiHmwuEb7LpvmXI1x/ymUvNzECAwEAAQ==";// 还原成真实的密码String result = ConfigTools.decrypt(publicKey, password);System.out.println("最终结果:" + result); 总结

本文我们使用阿里巴巴开源的 Druid 实现了 MySQL 的密码加密,Druid 的加密过程非常方便,无需编写任何代码,只需要添加 Druid 依赖,再通过 Druid 的工具类生成密文,最后将密文配置到 application.yml 文件即可。项目在运行时会通过拦截器将密文转换成真正的密码,从而实现了 MySQL 密码的加密和解码的过程。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。