iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中如何给数据库加密配置项
  • 808
分享到

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

2023-06-02 10:06:23 808人浏览 安东尼
摘要

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

这篇文章主要讲解了“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配置文件。

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

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

但仔细一琢磨,发现:

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

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

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

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

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

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


哪些信息要加密呢?

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

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

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

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

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

  • …等等

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


如何加密配置项呢?

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

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

这就不再赘述了

引入jasypt-spring-boot加密组件

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

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

配置加密密钥

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

jasypt.encryptor.password=CodeSheep

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

加密测试

为了便于测试,我们直接扩展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==

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

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

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

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

查看密码解密结果

@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()语法包裹的配置项加密字段自动解密,数据得以还原。


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

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

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

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

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


自定义加密前后缀

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

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

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

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


让加密更安全

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

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

使用自定义加密器

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

自定义加密规则非常简单,只需要提供自定义的加密器配置类即可,比如我这里自定义一个名为 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

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

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

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

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中如何给数据库加密配置项这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java中如何给数据库加密配置项

本文链接: https://www.lsjlt.com/news/229732.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中如何给数据库加密配置项
    这篇文章主要讲解了“Java中如何给数据库加密配置项”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中如何给数据库加密配置项”吧!先看一份典型的配置文件... 省略 ...## 配置M...
    99+
    2023-06-02
  • java如何给链接数据库加密
    在java中使用DES算法对数据库进行加密,具体方法如下:import java.security.Key;import java.security.SecureRandom;import javax.crypto.Cipher;impor...
    99+
    2024-04-02
  • SpringBoot项目中如何利用application.yml文件配置数据库密码加密
    这篇文章主要讲解了“SpringBoot项目中如何利用application.yml文件配置数据库密码加密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot项目中如何利用ap...
    99+
    2023-06-08
  • springboot如何给数据库地址加密
    使用pringboot对数据库地址进行加密的方法首先,需要在springboot项目中导入依赖;com.github.ulisesbocchiojasypt-spring-boot-starter2.0.0依赖导入好后,在springboo...
    99+
    2024-04-02
  • 如何用md5函数给数据库加密
    在MySQL数据库中使用md5函数进行加密的方法首先,在MySQL数据库中新建一个test表;CREATE TABLE test (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varcha ...
    99+
    2024-04-02
  • 如何给pdf数据加密
    对pdf文件进行数据加密的方法首先,在打开并进入一个pdf文档;在pdf文档中,点击上方的“视图”选项,并在下拉列表中选择“工具”>“保护”选项;进入保护页面后,在右侧窗口中点击“加密”按钮,并在下拉中选择“使用口令加密”选项;在弹出的口令...
    99+
    2024-04-02
  • springboot项目数据库密码如何加密
    前言 在我们日常开发中,我们可能很随意把数据库密码直接明文暴露在配置文件中,在开发环境可以这么做,但是在生产环境,是相当不建议这么做,毕竟安全无小事,谁也不知道哪天密码就莫名其妙泄...
    99+
    2024-04-02
  • Django项目如何给数据库添加约束
    只要你的Web开发知识不是语文老师教的,那么你应该已经知道一个合格的开发者应该永远抱着怀疑的眼光看用户提交的数据。你不仅需要在前端通过表单或其它方式进行验证,还需要在后台视图拿到用户...
    99+
    2024-04-02
  • 怎么给mysql数据库中密码属性加密
    mysql数据库给密码属性加密的方法有以下几种使用password()函数加密select password('root');sy old_password()函数加密select old_...
    99+
    2024-04-02
  • 如何给yml配置文件的密码加密(SpringBoot)
    目录1.低版本2.x1)引入jar包2)生成密码3)测下解密4)yml配置5)测测登录2.高版本 3.x1)引入jar包2)生成密码3)yml配置最近在忙着解决规约扫描的问题,其一就...
    99+
    2022-11-13
    yml配置文件 yml密码加密 yml配置文件密码加密
  • java项目中如何实现数据的加密与解密
    java项目中如何实现数据的加密与解密?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  这是一个关于密钥查询的jsp文件,接受上级文件的数据并加密处理,放入Map集合...
    99+
    2023-05-31
    java 加密 解密
  • springboot数据库密码加密的配置方法
    前言 由于系统安全的考虑,配置文件中不能出现明文密码的问题,本文就给大家详细介绍下springboot配置数据库密码加密的方法,下面话不多说了,来一起看看详细的介绍吧 1.导入依赖 ...
    99+
    2024-04-02
  • js前端如何给url数据加密
    js前端实现给url数据加密的方法传参页面<script type=”text/javascript”>// <![CDATA[function send(){var url&nbs...
    99+
    2024-04-02
  • jboss数据库如何加密
    对jboss数据库进加密的方法首先,在jboss安装目录中查找到jtds-ds.xml数据源文件;jtds-ds.xml数据源文件查找到后,使用记事本打开;文件打开后,在文件中进行以下修改;<datasources><lo...
    99+
    2024-04-02
  • 易语言怎么给db数据库加密
    使用易语言对db数据库进行加密的方法易语言程序如下:.版本 2.程序集 窗口程序集_启动窗口.子程序 _按钮1_被单击, , , 打开.如果 (打开 (“test.edb”, , , , , 编辑框1.内容, ) = 假)信息框 (“打开数...
    99+
    2024-04-02
  • Jaspersoft Studio如何添加mysql数据库配置
    这篇文章给大家分享的是有关Jaspersoft Studio如何添加mysql数据库配置的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。步骤如下1、创建数据配置 在Data Adapters上右...
    99+
    2023-06-29
  • thinkphp3.2如何增加数据库配置并操作数据
    这篇文章主要介绍了thinkphp3.2如何增加数据库配置并操作数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇thinkphp3.2如何增加数据库配置并操作数据文章都会有所收获,下面我们一起来看看吧。一、数...
    99+
    2023-07-05
  • springboot项目数据库密码怎么加密
    这篇文章主要介绍“springboot项目数据库密码怎么加密”,在日常操作中,相信很多人在springboot项目数据库密码怎么加密问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot项目数据库...
    99+
    2023-06-20
  • vb如何对数据库加密解密
    通过使用以下vb函数,对数据库进行加密和解密运算,代码如下:Private Function Encrypt(ByVal strSource As String, ByVal Key1 As Byte, _ ByVal Key2 As In...
    99+
    2024-04-02
  • edb数据库如何加密码
    给edb数据库设置密码的方法首先,打开并进入易语言编程软件;在软件界面中点击上方的“数据库”按钮,并在下拉中选择“结构编辑器”选项;进入结构编译器页面后,在界面中点击“置密码”按钮;在弹出的文件选择对话框中,选择需要设置密码的edb数据库,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作