点击关注公众号,利用碎片时间学习

第一种Jasypt加密

  1. maven依赖

不同的spring boot版本引入的jasypt版本不同

<!-- Jasypt加密 -->
spring boot 版本号1依赖
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.0.0</version>
</dependency>
spring boot 版本号2依赖
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>
  1. 在配置中心增加相关配置

jasypt.encryptor.password=henghe #加密密钥

或者

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

java -jar xxx.jar -Djasypt.encryptor.password=henghe
  1. 将application.yml或配置中心中重要的配置改为加密格式

password: ENC(tnJpIM6iACWO/wRI//7XsbBqy/Mpx6MG1hXe4S7U4cNWmGhajnUSeXmBmQiniKEU)
  1. springboot程序在启动会自动检测appliction.yml或者配置中心中有ENC(xx)的配置并做解密

  2. 加解密的测试类

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEByteEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;/*** @Created with Intellij IDEA* @Author : * @Date : 2018/5/18 - 10:37* @Copyright (C), 2018-2018* @Descripition : Jasypt安全框架加密类工具包*/
public class JasyptUtils {/*** Jasypt生成加密结果** @param password 配置文件中设定的加密密码 jasypt.encryptor.password* @param value    待加密值* @return*/public static String encryptPwd(String password, String value) {PooledPBEStringEncryptor encryptOr = new PooledPBEStringEncryptor();encryptOr.setConfig(cryptOr(password));String result = encryptOr.encrypt(value);return result;}/*** 解密** @param password 配置文件中设定的加密密码 jasypt.encryptor.password* @param value    待解密密文* @return*/public static String decyptPwd(String password, String value) {PooledPBEStringEncryptor encryptOr = new PooledPBEStringEncryptor();encryptOr.setConfig(cryptOr(password));String result = encryptOr.decrypt(value);return result;}/*** @param password salt* @return*/public static SimpleStringPBEConfig cryptOr(String password) {SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(password);config.setAlgorithm(StandardPBEByteEncryptor.DEFAULT_ALGORITHM);config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName(null);config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setStringOutputType("base64");return config;}public static void main(String[] args) {// 加密System.out.println(encryptPwd("EbfYkitulv73I2p0mXI50JMXoaxZTKJ7", "root@1234"));// 解密
//        mysql@1234
//        System.out.println(decyptPwd("EbfYkitulv73I2p0mXI50JMXoaxZTKJ7", "bgWQ4OfVCUJ1ExsqNhGV+KKBgpx8alv+"));//        root@1234
//        System.out.println(decyptPwd("EbfYkitulv73I2p0mXI50JMXoaxZTKJ7", "tdHzge8YvviOJaiV/+P6uQ9wgB44D1aH"));}}

第二种,自定义class

实现EnvironmentPostProcessor

从Spring Boot 1.3开始,我们可以在应用程序上下文刷新之前使用EnvironmentPostProcessor来自定义应用程序的EnvironmentEnvironment表示当前应用程序运行的环境,它可以统一访问各种属性源中的属性,如属性文件、JVM系统属性、系统环境变量和Servlet上下文参数。使用EnvironmentPostProcessor可以在bean初始化之前对Environment进行修改

EnvironmentPostProcessor可以在创建应用程序上下文之前,添加或者修改环境配置。

EnvironmentPostProcessor接口实现代表:ConfigFileApplicationListener

  1. 加密解密工具类

package com.yss.henghe.iris.configuration;/*** @Description * @Author 86199* @Date 2021/12/1 16:36*/import java.util.Base64;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RSAEncryptDecrypt
{// 公钥private static String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqfkYJn8BHttyGrQYcoXTZK8Za" +"MVUkqhEdFIyWZhnUQz6Jr299IkBCrbTnKcQTn3ekyQl5/F+j2p8YuNQDBJiq46T/srI+zh1XIaTIKJoOI8M4ploKOztJ8IP" +"L9ucdnv/tEdGDD9kY5JILa5DQnem9HkaS55kGJX6Oet6CRiNekwiG4+K61SjyfqxuLcqm7v2gH2nvTnkci9FLwtErpdF4uT" +"Mv6LB46Z9Hpg5iVsHDbwnwqOCfirgwdalJQTy+jcn9UqqNTsneREOxTtt9JQEnsDE/4UIPAYiU6cQDRJ5YrXR56LYC/0g55" +"KpMVnMIJgS5Y/YVt66QHtUTCVmmSgxAQIDAQAB";// 私钥private static String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCp+" +"RgmfwEe23IatBhyhdNkrxloxVSSqER0UjJZmGdRDPomvb30iQEKttOcpxBOfd6TJCXn8X6Panxi41AMEmKrjpP+" +"ysj7OHVchpMgomg4jwzimWgo7O0nwg8v25x2e/+0R0YMP2RjkkgtrkNCd6b0eRpLnmQYlfo563oJGI16TCIbj4rrVKPJ+" +"rG4tyqbu/aAfae9OeRyL0UvC0Sul0Xi5My/osHjpn0emDmJWwcNvCfCo4J+" +"KuDB1qUlBPL6Nyf1Sqo1Oyd5EQ7FO230lASewMT/hQg8BiJTpxANEnlitdHnotgL/SDnkqkxWcwgmBLlj" +"9hW3rpAe1RMJWaZKDEBAgMBAAECggEBAIHEloaVglJ/sf7nLp8IwxrkgB64QVhytUillKFItOBxau53A" +"HaYvr3iVW8NMWrruClYeMQ7YKe34d1RtMRyqPhXs2/cfFMoiJmqeNt6gt1jga/i9V4BfRJUm2mrXiorg" +"06s97LUFx3aCdcua1Vsqn+NkeDXvY3zuwXLXPFi2GjcRBnwZL9S2i8mxCSChWy8ePjYW34bJ7viTQ7hf" +"Hz5VNA0hqMQrmgzUADq5xelnhQKsEWBaHHhLTKGYF0yNmRJ7zQJkiSncxIrzD5dvRH88Ms2nJ7lJlb1F" +"YEpZ8URlK63ofOskvcpvXFH3g7yvi6j9rCRFAL/i2UnP+lFimQ+bs0CgYEA7ZdVrSGMsKRwaX7+lmCTu" +"5cR6V74ohZKyDyzp8PcOBxvPmjY5tIULK++12xyOpsMHAwAoKfRedRrvS9vm525g5A+fioALXE74/d2A7" +"E/psO6hO89W5AcA91wMTZXLLGZ8JD0LBQp3u4dNGyyZLpDMTgM1WUsted1mOn2msRkK68CgYEAtySKlvaL" +"8Rw70LMMYZUUJ6BbUsR85aJHZ3JPsisM01PgEgcJiZHfThVZHqUgEU0noqRDzIVVKk9C1Gqx+t6F3JqU8" +"Cewop+nIKboLH5vMr+7OqM5hXLSx9g8Mm779k9P4+u7Kvq4/fY38d7kVayr3TVb5g0jEo1ugsHonwMsKk8Cg" +"YBa791/EqRCx+2us0jGTdi9qCjW5d7MSzP8SB+LSs/zOg7qGD9MuYO3Rt0Inx1piQathXqIAzOOKdvC4XEaYtgqnv8" +"MUw8WVYzSyFiHOURfk/LEBr25WgMfB5Z1f5MGLEP7a7/JTz5ncUQEWMY+/3vQTt+6narrRNgh2wrkWd7tSQKBgGIs" +"YWpZUVz3UI0oXbu1iW9Qg4PTtkv2eKZYXaZZc2+ZJ6UiRpeLLZQS14oY5B7CKDwEKB/rXWLnyCBL7YpYXJOL/cjazd" +"HvGUzki9LGF9+xbbEaLEx/58OfA23ZlpFLpLy98cAxVJc2tHigje/rNtnGr7ObWTCpxhKr1YHf1n37AoGBAI64k/lV4" +"FJn57cJnIZPp1jjapxSouxO063Z5BTYVsA6/cqXgbNPt1S8TnZRaRB2qtVrN5otRuueO6GIRJf6XTXvwxLV4xQAA/Z5" +"g2q2gelK7/ChYRdVn6Fwtnwx4iPBkH6FK+eQ0E8BfcJ5f6XPWp8N7ZpaZrd+dyc3r7uW78gG";//加密public static byte[] encrypt(byte[] str, String publicKey) throws Exception{// base64编码的公钥byte[] decoded = Base64.getDecoder().decode(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));// RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);return cipher.doFinal(str);}//解密public static byte[] decrypt(byte[] str) throws Exception{// base64编码的私钥byte[] decoded = Base64.getDecoder().decode(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));// RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);return cipher.doFinal(str);}public static void main(String[] args) throws Exception{byte[] message = "1q2w3eROOT!".getBytes();System.out.println("原始字符串为:" + new String(message));byte[] messageEn = encrypt(message, publicKey);String encryPassword = new String(Base64.getEncoder().encode(messageEn));System.out.println("加密后的Base64字符串为:" + encryPassword);String str = new String(Base64.getEncoder().encode(messageEn));byte[] decode = Base64.getDecoder().decode(str);byte[] messageDe = RSAEncryptDecrypt.decrypt(decode);System.out.println("还原后的字符串为:" + new String(messageDe));}
}
  1. 创建自定义类,实现EnvironmentPostProcessor

package com.yss.henghe.iris.configuration;import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.*;import java.util.*;/*** @Description* @Author 86199* @Date 2021/12/1 14:05*/
public class SafetyEncryptProcessor implements EnvironmentPostProcessor{public static final String SPRING_DATASOURCE_PASSWORD = "spring.datasource.password";public static final String PASSWORD_ENABLE_ENCRYPT = "password.enable.encrypt";public static final String TRUE = "true";@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {String enableEncrypt = environment.getProperty(PASSWORD_ENABLE_ENCRYPT);if (TRUE.equals(enableEncrypt)) {String password = environment.getProperty(SPRING_DATASOURCE_PASSWORD);Properties properties = new Properties();byte[] decode = Base64.getDecoder().decode(password);byte[] messageDe = new byte[0];try {messageDe = RSAEncryptDecrypt.decrypt(decode);} catch (Exception e) {}properties.setProperty(SPRING_DATASOURCE_PASSWORD, new String(messageDe));PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource(SPRING_DATASOURCE_PASSWORD,properties);environment.getPropertySources().addFirst(propertiesPropertySource);}}
}
  1. META-INF下创建spring.factories,并且引入CustomEnvironmentPostProcessor

spring.factories:

org.springframework.boot.env.EnvironmentPostProcessor=\
com.yss.henghe.iris.configuration.SafetyEncryptProcessor
  1. 将加密后的密码写入到配置文件中

spring.datasource.password
  1. 公钥私钥生成方法,利用datax工具,可以生成1024,2048等制定要求的公钥秘钥

maven依赖

<dependency> <groupId>com.alibaba.datax</groupId> <artifactId>datax-core</artifactId> <version>0.0.1-SNAPSHOT</version>
</dependency>
public static void main(String[] args) throws Exception{String[] initKey = SecretUtil.initKey(); System.out.printf("%s: %s\n","publicKey",initKey[0]); System.out.printf("%s: %s\n","privateKey",initKey[1]);
}

来源:blog.csdn.net/weixin_42728895/article/details/121731571

推荐:

最全的java面试题库

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

两种方式,实现 SpringBoot 中数据库密码加密相关推荐

  1. 关于项目中数据库密码加密的使用

    关于项目中数据库密码加密的使用 1 使用需求 2 使用步骤 1 准备一个SpringBoot项目环境 2 添加jasypt的jar包 3 创建一个测试类 4 修改配置文件 5 启动项目,访问忌口 6 ...

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

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

  3. java配置文件中数据库密码加密

    最近,有位读者私信我说,他们公司的项目中配置的数据库密码没有加密,编译打包后的项目被人反编译了,从项目中成功获取到数据库的账号和密码,进一步登录数据库获取了相关的数据,并对数据库进行了破坏. 虽然这次 ...

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

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

  5. url 参数传递的两种方式_VB编程中的传值与传址两种参数传递方式,你清楚吗?...

    Tips:欢迎公众号设置为星标,VB技术干货文章可以第一时间看到.如您在学习VB过程中有独特的见解或者想法,欢迎投稿,可在公众号文章下直接留言. 推荐阅读 1. VB编程语言基础知识点总结 2. VB ...

  6. RabbitMQ延迟消息场景分析以及实现两种方式(SpringBoot)

    使用场景,不限于下面 用户下订单结束,如果用户未及时支付,后续需要取消订单,可以怎么做?定时任务可以做,但是不能接近实时或者消耗数据库性能太大. [数据库定时任务方案]:定时任务可以做到订单的状态的改 ...

  7. SpringBoot Druid数据库密码加密

    废话不多说,直接贴代码,毕竟搜这个的就是想知道怎么搞. 1. 依赖 <dependency><groupId>com.alibaba</groupId><ar ...

  8. 两种方式调试JNI中DLL(动态链接库)

    http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=24352482&id=374076 一,附加方式 1,eclipse链 ...

  9. 纯配置方式使用durid的数据库密码加密

    主要是使用durid中的ConfigFilter实现,官方文档可参考这里,但是官方文档里没有介绍纯配置方式的用法,我自己试了下,总结了纯配置的用法. 第一步:生成密码和密钥 这一步可以使用官方文档里的 ...

  10. SQL SERVER 2000 数据库备份和SQL Server数据库备份有两种方式,

    SQL SERVER 2000 数据库备份与还原时间:2006-08-30 10:23:23  来源:CSDN  作者:佚名备份数据库,例如: BACKUP DATABASE Northwind    ...

最新文章

  1. [Swift]LeetCode901. 股票价格跨度 | Online Stock Span
  2. 基于Windows Server 2003 ntbackup下数据文件的完整备份与差异备份
  3. C++走向远洋——26(项目二,2,构造函数与析构函数)
  4. c++可视化界面_新基建的福音:智慧楼宇可视化监控系统引领智能化新时代
  5. 【计算机网络复习 数据链路层】3.6.5 PPP、HDLC
  6. 关于map对key自定义排序
  7. 电脑安装python后开不了机_ubuntu 安装python3.6后,terminal终端打不开问题
  8. 计算机科学与技术文理兼收吗,哪些专业是文理兼收的专业?
  9. 为什么刹车热了会失灵_刹车油只要不缺,没必要更换,真的是这样吗?
  10. react 翻书效果_React实现翻页功能
  11. catia三维轴承_基于CATIA的轴承三维参数化标准件库的开发
  12. Oracle12C-针对log4j漏洞补丁修复
  13. 文件复制到u盘后文件夹是空的,怎么恢复?
  14. npm install很慢(奇葩)解决方法
  15. Android 10 及api29之后,解决全透明导航栏不成功
  16. JS验证电话和传真号码格式
  17. String 翻转字符串
  18. Windows 11最新版:任务管理器性能参数详解,什么是分页缓冲池和句柄
  19. for example: not eligible for auto-proxying问题排查
  20. 再见2007,寄语2008

热门文章

  1. vue 富文本编辑器wangeditor 上传图片
  2. C盘空间不足怎么办?试试这款软件
  3. 5分钟商学院-个人篇-沟通能力
  4. 全网最全的AItium Designer 16下载资源与安装步骤
  5. 【3dmax千千问】食住玩初学3dmax插件神器第24课:3dmax自学渲染效果图教程|疯狂模渲大师、室内设计师、效果图绘图员都应该如何认识VRAY或扫描线CORONA渲染器及其VR核心算法的作用?
  6. 常用数据分析方法总结
  7. java初级程序员_为什么现在JAVA初级程序员要求这么高?
  8. JAVA复习 (期末重点考点总结)
  9. java复习/学习流程
  10. clark变换与Park变换的推导