前言

近期在进行项目安全方面评审时,质量管理部门有提出需要对配置文件中的敏高文件进行加密处理,避免了信息泄露问题。想想前段时间某公司上传github时,把相应的生产数据库明文密码也一并上传了,导致了相应的数据泄露问题。也确实,大部分项目无论开发、测试还是生产环境,相关的敏高信息都是明文存储的,也是一大安全隐患呀。所以今天来说说,如何对配置文件进行加密操作。

一点知识

何为Jasypt

Jasypt是一个Java库,允许开发人员以很简单的方式添加基本加密功能,而无需深入研究加密原理。利用它可以实现高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件。

  1. 高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件...
  2. 集成Hibernate的。
  3. 可集成到Spring应用程序中,与Spring Security集成。
  4. 集成的能力,用于加密的应用程序(即数据源)的配置。
  5. 特定功能的高性能加密的multi-processor/multi-core系统。
  6. 与任何JCE提供者使用开放的API

官网:http://www.jasypt.org/

SpringBoot集成Jasypt

SpringBoot中集成Jasypt,可直接使用开源的jasypt-spring-boot直接集成,使用简单方便。

常规集成示例

0.引入pom依赖

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

1.设置盐值和修改相应需要加密的配置参数

# 需要解密的地方,使用ENC()进行包裹处理
okong.name=ENC(Xj7Ykn2O0Hni/tN4oojPfw==) # 设置盐值,生产环境中,切记不要直接进行设置,可通过环境变量、命令行等形式进行设置。
jasypt.encryptor.password=lqdev

简单来说,就是在需要加密的值使用ENC()进行包裹,即:ENC(密文)。若想避免参数冲突,可修改前缀和后缀,可以直接使用jasypt.encryptor.property.prefixjasypt.encryptor.property.suffix进行修改即可。

之后想往常一样使用@Value("${}")即可。

包含xml引入时

在一些使用javaBean配置和xml两种混合模式时,使用第一种配置时,xml参数并未替换。此时看了官方文档,可以使用另一方式进行配置即可。

0.引入pom依赖

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

其实就是不进行自动配置而已。

1.启动类启动方式修改。

@SpringBootApplication
@Slf4j
public class JasyptApplication { public static void main(String[] args) throws Exception { // SpringApplication.run(JasyptApplication.class, args);
//使用自定义环境变量 实现一些特殊场景下的加密字符解密操作
//若无额外的xml引入文件需要解密时,可直接使用SpringApplication.run(JasyptApplication.class, args);即可
//若想在引入的xml中使用,需要加入环境变量,如以下模式
new SpringApplicationBuilder().environment(new StandardEncryptableEnvironment())
.sources(JasyptApplication.class).run(args);
log.info("spring-boot-jasypt-chapter37服务启动!");
}
}

其他配置项

Key Required Default Value
jasypt.encryptor.password True 盐值,根密码
jasypt.encryptor.algorithm False PBEWithMD5AndDES
jasypt.encryptor.keyObtentionIterations False 1000
jasypt.encryptor.poolSize False 1
jasypt.encryptor.providerName False SunJCE
jasypt.encryptor.providerClassName False null
jasypt.encryptor.saltGeneratorClassname False org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.ivGeneratorClassname False org.jasypt.salt.NoOpIVGenerator
jasypt.encryptor.stringOutputType False base64
jasypt.encryptor.proxyPropertySources False false

运维说明

为了方便运维人员对各类敏感密钥进行加密操作,提供了自动化脚本,方便生成相应的加密串。

密钥(盐值)存储说明

本身加解密过程都是通过盐值进行处理的,所以正常情况下盐值加密串是分开存储的。盐值应该放在系统属性命令行或是环境变量来使用,而不是放在配置文件。

命令行示例

java -jar xxx.jar --jasypt.encryptor.password=xxx &

环境变量示例

设置环境变量:

# 打开/etc/profile文件
vim /etc/profile
# 文件末尾插入
export JASYPT_PASSWORD = xxxx

启动命令:

java -jar xxx.jar --jasypt.encryptor.password=${JASYPT_PASSWORD} &

bat脚本

为了方便,简单编写了一个bat脚本方便使用。

 @echo off
set/p input=待加密的明文字符串:
set/p password=加密密钥(盐值):
echo 加密中......
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=%input% password=%password% algorithm=PBEWithMD5AndDES
pause

注意:jasypt-1.9.2.jar 文件需要和bat脚本放在相同目录下。此包可直接在示例项目中直接下载。

使用示例:

注意:相应加密串,每次加密的结果是不同的。

参考资料

  1. https://github.com/ulisesbocchio/jasypt-spring-boot

  2. http://www.jasypt.org/

总结

本章节主要简单介绍了如何使用jasypt对配置文件进行加密操作。一些其他高级应用,可以查看官方文档进行相关集成即可。集成起来相对来说比较简单,注意是要对密码(盐值)的管理,需要进行安全把控下,建议运维人员针对每个项目进行不一样的盐值操作,避免一个项目泄露了,造成其他关联项的信息泄露。安全无大小呀,还是谨慎为妙!

最后

目前互联网上很多大佬都有SpringBoot系列教程,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

老生常谈

  • 个人QQ:499452441
  • 微信公众号:lqdevOps

个人博客:http://blog.lqdev.cn

完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-37

原文地址:https://blog.lqdev.cn/2019/05/08/springboot/chapter-thirty-seven/

SpringBoot | 第三十七章:集成Jasypt实现配置项加密的更多相关文章

  1. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  2. Gradle 1.12用户指南翻译——第三十七章. OSGi 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  3. “全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. “全栈2019”Java第三十七章:类与字段

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. SpringBoot | 第三十三章:Spring web Servcies集成和使用

    前言 最近有个单位内网系统需要对接统一门户,进行单点登录和待办事项对接功能.一般上政府系统都会要求做统一登录功能,这个没啥问题,反正业务系统都是做单点登录的,改下shiro相关类就好了.看了接入方案, ...

  6. SpringBoot | 第三十一章:MongoDB的集成和使用

    前言 上一章节,简单讲解了如何集成Spring-data-jpa.本章节,我们来看看如何集成NoSQL的Mongodb.mongodb是最早热门非关系数据库的之一,使用也比较普遍.最适合来存储一些非结 ...

  7. 第三十七章 springboot+docker(手动部署)

    一.下载centos镜像 docker pull hub.c.163.com/library/centos:latest docker tag containId centos:7 docker ru ...

  8. 【第三十七章】 springboot+docker(手动部署)

    一.下载centos镜像 docker pull hub.c.163.com/library/centos:latest docker tag containId centos:7 docker ru ...

  9. 【SpringBoot】SpringBoot集成jasypt数据库密码加密

    一.为什么要使用jasypt库? 目前springboot单体应用项目中,甚至没有使用外部配置中心的多服务的微服务架构的项目,开发/测试/生产环境中的密码往往是明文配置在yml或properties文 ...

随机推荐

  1. JavaScript之闭包(重新认识)

    最近又重新学习了闭包,发现之前没有深刻理解作用域链,学习作用域链后对闭包才可以做到真正的理解.       闭包是指有权另一个函数作用域中变量的函数.要理解闭包首先理解作用域链.       执行环境 ...

  2. 笔试题: 数据库 已看1 一些关键的sql语句练习 和选择题 有用 sql语句练习 挺好

    一.     选择题 1.SQL语言是( C )语言. A.层次数据库 B.网络数据库 C.关系数据库 D.非数据库     redis 是 3.如果在where子句中有两个条件要同时满足,应该用哪个 ...

  3. redis学习总结1

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.和普通的Key-Value结构不同,Redis的Key支持灵活 ...

  4. Cygwin install apt-cyg

    1. UPDATE CYGWIN First of all you will need to ensure that Cygwin has the necessary binaries require ...

  5. Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)

    题目链接 C. Hacking Cyphertime limit per test1 secondmemory limit per test256 megabytesinputstandard inp ...

  6. redis集群搭建踩坑笔记

    推荐参考教程:https://blog.csdn.net/pucao_cug/article/details/69250101 错误: from /usr/lib/ruby/2.3.0/rubygem ...

  7. Smtp错误码

    Smtp错误码列表及相关原因 错误总表 420 1. Timeout Communication Problem Encountered During Transmission. Thie Is a ...

  8. 学习笔记:首次进行JUnit+Ant构建自动的单元测试(二)

    关键字:JUnit,Ant,单元测试 终于把JUnit+Ant构建单元测试的大概了解了,其实我实践的过程是对了,只是指导博客(看到这里不懂请看我上一篇博客)本身的错误“成功”把我带入“坑”,有时候网友 ...

  9. [FZU 1901]Period II KMP

    For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p-1], then the ...

  10. SQL SERVER的update select语句的写法

    需求: 要根据表A的数据来更新表B的某些字段,A和B要进行条件关联. 常规做法可能写个子查询 简单写法是用SQL Server的update select语法 update T_STOCK_INFO ...