网站首页 > 资源文章 正文
一、前言
最新公司为了提高代码安全性,要求数据库,kakfa,redis的连接不能直接明文配置。找了很多方案最终发现这个jasypt-spring-boot组件,但也被这个组件坑炸了,为什么呢?因为出现死锁的问题。线上直接P0级别事故,现在我们来复盘一下这个死锁问题。首先分享一下如何集成这个组件。
二、如何集成
1、引入jasypt-spring-boot加密组件的starter(特别说明出现死锁的版本:3.0.3)
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
2、jasypt常用参数说明
2.1、algorithm与iv-generator-classname对应关系
algorithm | iv-generator-classname | 版本 |
PBEWithMD5AndDES | org.jasypt.iv.NoIvGenerator | 3.0.0已下版本 |
PBEWITHHMACSHA512ANDAES_256 | org.jasypt.iv.RandomIvGenerator | 3.0.0以上版本 |
如果对应错误启动的时候会报以下错误
Failed to bind properties under 'xxx.xxx.xxx' to java.lang.String
2.2、配置说明
#自定义加密密钥,对配置文件里的重要项进行加密
jasypt:
encryptor:
password: xiao #加密算法密钥
property:
prefix: ENC( #算法识别前缀,加密后的账号密码需要用这个包起来
suffix: ) #算法识别后缀
algorithm: PBEWITHHMACSHA512ANDAES_256 #默认加密算法
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
algorithm加密算法要与IvGeneratorClassName对应的值配套
2、正常的明文配置文件yml(安全级别为0)
server:
port: 10000
spring:
application:
name: xixien
datasource:
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
3、通过工具类生成加密后的账号,密码
package com.xixien.api.base.utils;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
public class JasyptUtils {
public static void main(String[] args) {
String username = encrypt("root");
String password = encrypt("123456");
System.out.println("加密后的账号:"+username);
System.out.println("加密后的密码:"+password);
System.out.println("加密前的账号:"+decrypt(username));
System.out.println("加密前的密码:"+decrypt(password));
}
/**
* 加密
* @param plaintext 明文密码
*
*/
public static String encrypt(String plaintext) {
//加密工具
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
//加密配置
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
// 算法类型
//config.setAlgorithm("PBEWithMD5AndDES");
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
//生成秘钥的公钥
config.setPassword("xiao");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
//应用配置
encryptor.setConfig(config);
//加密
return encryptor.encrypt(plaintext);
}
/**
* 解密
*
* @param ciphertext 待解密秘钥
*
*/
public static String decrypt(String ciphertext) {
//加密工具
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
//加密配置
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
//config.setAlgorithm("PBEWithMD5AndDES");
//生成秘钥的公钥
config.setPassword("xiao");
//加密算法要与IvGeneratorClassName对应的值配套
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
//应用配置
encryptor.setConfig(config);
//解密
return encryptor.decrypt(ciphertext);
}
}
main行数运行结果
替换名为配置
原来的明文密码值,改为 ENC(xxx) ,其中xxx是密文。
server:
port: 10000
spring:
application:
name: xixien
datasource:
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: ENC(9dGDBltW5Q9ealpUkaoEQyup4CSDr7Gz+CKpat3Uq99Wwaz7In4PyKKPSJOs+stK)
password: ENC(q1KCCS7dSI1eznFC9i7ml3cuGRPjhXYswqkgJWAffMJlkS1I4E35GiQqsv8gHYpx)
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
#自定义加密密钥,对配置文件里的重要项进行加密
jasypt:
encryptor:
password: xiao #加密算法密钥(例子我们放这里)
property:
prefix: ENC( #算法识别前缀,加密后的账号密码需要用这个包起来
suffix: ) #算法识别后缀
algorithm: PBEWITHHMACSHA512ANDAES_256 #默认加密算法
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
自定义加密前后缀:
默认前缀prefix=ENC( 后缀 suffix= ) 这个可以自己随心所欲的替换比如LOL()
jasypt:
encryptor:
property:
prefix: LOL( #算法识别前缀,加密后的账号密码需要用这个包起来
suffix: )
看完这些你是否思考了
三、如何更安全
1、使用自定义加密器
下面是一个自定义加密器bean,可以看到除了一些在yml文件中配置的属性还多了配置(加上了注释的代码),源码类JasyptEncryptorConfigurationProperties中有些默认配置
@Configuration
public class XiaoXiongEncryptorCfg {
//默认bean为jasyptStringEncryptor
@Bean( name = "xiaoXiongEncryptorBean" )
public StringEncryptor xiaoXiongEncryptorBean() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("xiao");
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
//源码默认值
config.setKeyObtentionIterations("1000");
//源码默认值
config.setPoolSize("1");
//源码默认值
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
//源码默认值
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
2、密钥不放在配置文件中
- 方式一:直接作为程序启动时的命令行参数来带入
java -jar project.jar --jasypt.encryptor.password=xiao
- 方式二:直接作为程序启动时的应用环境变量来带入
java -Djasypt.encryptor.password=xiao -jar project.jar
- 方式三:甚至可以作为系统环境变量的方式来带入
比方说,我们提前设置好系统环境变量JASYPT_ENCRYPTOR_PASSWORD = xiao,则直接在Spring Boot的项目配置文件中做如下配置即可:
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD}
死锁
我线上的某个业务触发了这个死锁。程序表现为假死,最后通过分析堆栈日志找到这个死锁。也在github上第277的issues发现了端倪。真是脑裂呀
https://github.com/ulisesbocchio/jasypt-spring-boot/issues/277
1、原因
2、修改后的代码
- 上一篇: 树莓派隐藏鼠标光标和修改启动界面
- 下一篇: 可以预热双12装机啦:超性价比游戏电脑推荐
猜你喜欢
- 2024-10-02 JVM发生CMS GC的 5 种情况,你知道的肯定不全
- 2024-10-02 RabbitMQ 实现延迟队列的两种方式
- 2024-10-02 用树莓派做一个木制 LED 游戏显示器 的教程
- 2024-10-02 华硕ROG Zenith Extreme Alpha主板评测:超跑级座驾已不足以形容
- 2024-10-02 常见端口详解及攻击策略 (15年前的黑客经典)
- 2024-10-02 小福利,菜鸟练级必备电子书(2021菜鸟教程)
- 2024-10-02 Linux磁盘管理(Linux磁盘管理实验)
- 2024-10-02 Linux分区命令与格式化实战案例(linux 分区格式)
- 2024-10-02 华硕ROG Zenith Extreme Alpha主板评测:主板界的航空母舰
- 2024-10-02 电脑端口基础知识(非常详细)(电脑端口百科)
你 发表评论:
欢迎- 05-1430个在线地图瓦片URL分享
- 05-1425个在线地图瓦片URL分享
- 05-14PixelStyle for Mac(mac照片编辑器)
- 05-14一篇文章带你了解CSS3 3D 转换知识
- 05-14我们的世界是假的?马斯克:我们生活在高文明模拟的矩阵游戏中
- 05-14【视觉AI的基石】斯坦福大学笔记!带你吃透卷积神经网络 (CNN)
- 05-14潮流 | 通过AAPE的新价目,无虑入荷未来主义服饰
- 05-14身份证查询服务API:准确识别身份证信息
- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)