前言:

近期所做的项目进入测试阶段,在源码扫描时被检测出一些安全风险,其中就有配置文件中连接数据库的密码不能以明文展示这一问题。思考一下如果以明文展示确实会有很大的安全隐患,万一得罪一些深藏不露的黑客大佬,那数据库就面临被攻击的风险。接下来介绍的也是我试验了好几个版本最终得出的一个较为简单的方法,当然每个人的项目版本,以及依赖等等都不相同,不能保证我认为最简单的在其他项目上也适用,所以如果此方法不行不要着急,多翻几篇文章总有一个适合你。

话不多说,上正文:

1.引入jasypt相关依赖

我用的是3.0.3版本,默认使用的是 PBEWITHHMACSHA512ANDAES_256高级的算法加密(还有一种低版本的加密方式是MD5,这个不做过多讲解,自行查找),SHA512和DAES_256,前者为不可解加密后者可解加密,两者具体实现原理可自行百度。

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

2.创建加密解密的工具包(一键cv)

package com.wangxiaobai.utils;import com.wangxiaobai.common.Constants;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;/*** 配置文件中密码加解密工具类*/
public class JasypUtil {private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";/*** @Description: Jasyp 加密(PBEWITHHMACSHA512ANDAES_256)* @param        plainText  待加密的原文* @param        factor     加密秘钥* @return       java.lang.String*/public static String encryptWithSHA512(String plainText, String factor) {// 1. 创建加解密工具实例PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();// 2. 加解密配置SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(factor);config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);// 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置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);// 3. 加密return encryptor.encrypt(plainText);}/*** @Description: Jaspy解密(PBEWITHHMACSHA512ANDAES_256)* @param        encryptedText  待解密密文* @param        factor         解密秘钥* @return       java.lang.String*/public static String decryptWithSHA512(String encryptedText, String factor) {// 1. 创建加解密工具实例PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();// 2. 加解密配置SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(factor);config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);// 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置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);// 3. 解密return encryptor.decrypt(encryptedText);}public static void main(String[] args) {String factor = Constants.JASYPT_PASSWORD_CODE; // 这里我用的常量类,自己可以直接写string类型字符串String plainText = "123456";String encryptWithSHA512Str = encryptWithSHA512(plainText, factor);String decryptWithSHA512Str = decryptWithSHA512(encryptWithSHA512Str, factor);System.out.println("采用AES256加密前原文密文:" + encryptWithSHA512Str);System.out.println("采用AES256解密后密文原文:" + decryptWithSHA512Str);}
}

3.添加密钥

在配置文件中添加密钥以及加密形式,密钥要与工具类中的factor保持一致,如果密钥不同则不能解密。加密格式也要与工具类中的字段一致。

jasypt.encryptor.password= wangxiaobai
jasypt.encryptor.algorithm=PBEWITHHMACSHA512ANDAES_256

4.修改配置文件

将自己的数据库连接密码用上述工具类运行生成加密串,将生成的加密串用ENC(加密串) 这种形式将明文密码替换掉。用ENC包裹是因为是根据ENC前缀进行解码,当项目运行时会自动识别,当发现有ENC包裹的加密串,则会自动解码,如果没有用他包裹则项目运行时就不能自动解密。

database.url=jdbc:postgresql://127.0.0.1:5433/aaa?useUnicode=true&characterEncoding=utf8&useSSL=true
database.username=pgsql
database.password=ENC(3qNVZYY0dnpLy+5e5aH9XQg9o9ddarmVg7Cc98rtyDJjRI7Gj7Wd0epxcqVB+V4a)
database1.url=jdbc:postgresql://127.0.0.1:5433/testmm?useUnicode=true&characterEncoding=utf8&useSSL=true
database1.username=pgsql
database1.password=ENC(6a1VH8MQKj9IFZBYjlXXkUtUYIuxF1ebyk2zWSBXIl7WkQuXH5OWj6y70Qd4VEqi)

我的配置文件中连接了两个数据库,都加密即可。

如果自爱配置文件中有其他密码也可以按照此种方式进行加密,多个密码与一个密码没有区别。


以上代码在运行时没有发现别的错误,如果大家在运行过程中有错误可以考虑一下是不是版本不匹配。

当我把源码提交机器检测的时候竟然又发现密码不安全定位错误位置到第3步的密钥password上,原来机器将这个也当做密码,那怎么办?解决呗

这也有两种方式

第一既然密码都可以加密,那把密钥也加密不就行了,所以把密钥也用ENC()这种格式进行加密。注意:密钥加密之后直接运行的话会报错,数据库链接密码不能解密。是因为我们的密钥已经更新了虽然解密后跟之前一样但是必须写法不一样了,所以要用最新的密钥把之前的数据库密码重新生成加密串。对,没错就是要把加密过后的加密串写在工具类中的factor字段上。

第二既然他是扫描配置文件中所有password字段,那就不把密钥的password写在配置文件中呗。

将配置文件中的密钥删除,在启动类上加入密钥当项目启动时也是先扫描到密钥进行解密

同样我这里边用的是我项目中自己写的常量类中的字段代替string类型的密钥(我有现成的为何不用), 如果不想写的话可以直接写string类型的密钥,当然前提不管怎么写这个密钥一定要和工具类中的保持一致。

好了,到底了~~~~~~~~~~

Springboot项目中使用jasypt给配置文件中密码加密相关推荐

  1. SpringBoot配置文件数据库密码加密

    引言 需求:springboot的配置文件中,把连接数据库的密码加密,使之不是以明文存储 步骤 导入Maven坐标 <dependency><groupId>com.githu ...

  2. Springboot中,如何读取配置文件中的属性

    摘要:在比较大型的项目的开发中,比较经常修改的属性我们一般都是不会在代码里面写死的,而是将其定义在配置文件中,之后如果修改的话,我们可以直接去配置文件中修改,那么在springboot的项目中,我们应 ...

  3. 在springboot中,如何读取配置文件中的属性

    摘要:在比较大型的项目的开发中,比较经常修改的属性我们一般都是不会在代码里面写死的,而是将其定义在配置文件中,之后如果修改的话,我们可以直接去配置文件中修改,那么在springboot的项目中,我们应 ...

  4. java maven 读取配置文件_Java项目和maven项目中如何获取设置配置文件中的属性

    通常情况下,我们会在一些配置文件文件中配置一些属性.如: indexPath = E\:\\Tomcat_7.0\\webapps\\ipost_stage\\lucene\\index imgUpl ...

  5. SpringBoot项目在使用Maven打包war中遇到的问题

    问题描述 在使用maven打包(package)springboot项目为war项目后,在本地机器上使用Tomcat跑这个项目,访问资源时出现下面的错误: o.s.b.w.servlet.suppor ...

  6. 【java】springboot项目启动数据加载内存中的三种方法

    文章目录 一.前言 二.加载方式 2.1. 第一种:使用@PostConstruct注解(properties/yaml文件). 2.2. 第二种:使用@Order注解和CommandLineRunn ...

  7. SpringBoot配置文件敏感信息加密,springboot配置文件数据库密码加密jasypt

    使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysq ...

  8. springboot项目添加了logback-spring.xml配置文件不生效

    springboot,logback-spring.xml不生效 通常情况下springboot项目, 只需在src/main/resources下添加logback-spring.xml即可, lo ...

  9. java修改配置文件参数_在java类中获取在.properties配置文件中设置的参数

    如何获取.properties配置文件中的参数,我在网上查了半天没弄明白,后来在以前的项目中找到了,就写下来,避免遗忘. 1.配置文件:message_product.properties total ...

最新文章

  1. 《深入理解C++11:C++ 11新特性解析与应用》——1.3 C++11特性的分类
  2. C语言学习之求∑n!(即求1!+2!+3!+...+20!)
  3. spring源码刨析总结
  4. pcm转换在线工具_有木有好用的CAD格式转换工具可以推荐?在线等,挺急的
  5. 如何保证缓存与数据库双写时的数据一致性?
  6. Code::Blocks代码自动提示设置及常用快捷键 .
  7. echarts 不支持 手机 浏览器_中国北斗卫星导航系统真的来了!获国产手机力挺:但iPhone却不支持...
  8. [Linux网络编程]高并发-Epoll模型
  9. 检测mysql表更新吗,知网查重系统的数据库是多久更新一次?
  10. MISRA C指导指南解读系列1(MISRA C是什么)
  11. 长时间看电脑,眼睛疼的原因和治疗方法
  12. mysql drop表明_MySQL DROP TABLE会完全删除表还是仅删除结构?
  13. Android获取视频文件时长
  14. org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
  15. 能够有效提高App线下活动的方法
  16. C#使用wkhtmltopdf将网页存为pdf或图片
  17. 信息传播学习笔记(1)——SIS模型原理与公式推导
  18. 直播 | 骞云科技DevOps实践
  19. 8.19! 今天我有18生日,点击阅读或顶部 尾随幸运的一天!生日知识!↓——【Badboy】...
  20. python二级证书含金量排名_计算机二级证书的含金量不高?别小瞧,这些优势用处不小!...

热门文章

  1. Linux 学习- Ubuntu 查看本机IP
  2. ubuntu18 安装google谷歌浏览器
  3. 企业怎样做好网络营销中的论坛营销
  4. 百度超级链开放网络白皮书发布会,明天见!
  5. 探索神秘的编程语言的奥秘世界
  6. Linux使用解压命令unzip报错:unzip: cannot find zipfile directory in one of xxx.zip
  7. 网站老是被劫持怎么办
  8. 请大家帮我找一下问题
  9. ISO9001与ISO13485的区别
  10. Python+Django 实现MVT页面