1 简介

在上一篇文章中,介绍了Jasypt及其用法,具体细节可以查看【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?。如此利器,用之得当,那将事半功倍。本文将介绍Springboot整合Jasypt,实现配置信息的安全,如数据库连接、账号和密码、接口凭证信息等。

Jasypt可以为Springboot加密的信息很多,主要有:

  • System Property 系统变量
  • Envirnment Property 环境变量
  • Command Line argument 命令行参数
  • Application.properties 应用配置文件
  • Yaml properties 应用配置文件
  • other custom property sources 其它配置文件

经测试,Springboot 2.1.9版本与jasypt-spring-boot最新版本的3.0.0和2.1.2均有问题,本文使用2.1.1成功。

2 如何加入依赖

Jasypt整合到Springboot是另一个开源项目jasypt-spring-boot,主要有三种整合方式:

2.1 jasypt-spring-boot-starter

如果项目使用@SpringBootApplication@EnableAutoConfiguration注解,在pom中加入以下依赖即可对整个Spring的环境的配置信息进行加密解密。

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

2.2 jasypt-spring-boot

如果项目不使用@SpringBootApplication@EnableAutoConfiguration注解,我们就使用下面的依赖,然后在配置Java类中加上注解@EnableEncryptableProperties

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

配置类如下:

@Configuration
@EnableEncryptableProperties
public class MyApplication { }

2.3 只对特定配置加密解密

如果不想使用以上两种方式对所有配置信息都进行加密解密的话,可以使用注解@EncryptablePropertySource指定配置文件,依赖如下:

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

配置类如下:

@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication { }

3 生成加密字符

生成加密字符有多种方式,在实践中使用过以下几种方式。

3.1 Java命令行

Jasypt提供了一个类专门用于加密解密,提供了main方法,调用如下:

java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password=pkslow algorithm=PBEWithMD5AndTripleDES input=larry

输出为:

----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.212-b10 ----ARGUMENTS-------------------
input: larry
algorithm: PBEWithMD5AndTripleDES
password: pkslow ----OUTPUT----------------------
SUfiOs8MvmAUjg+oWl/6dQ==

3.2 脚本命令

Jasypt为我们提供了脚本,可以直接用于加密解密,从http://www.jasypt.org/download.html可以下载。下载解压后的文件有:

# 解压后文件
LICENSE.txt NOTICE.txt README.txt apidocs bin lib
# bin文件夹的文件
decrypt.bat decrypt.sh
digest.bat digest.sh
encrypt.bat encrypt.sh
listAlgorithms.bat listAlgorithms.sh

在bin目录下面,我们可以根据自己的系统选择使用什么脚本来生成密文,使用参数与Java命令一样。其实这些脚本就是封装了一个调用Java类的工具。使用如下:

$ sh encrypt.sh password=pkslow algorithm=PBEWithMD5AndTripleDES input=larry

----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.212-b10 ----ARGUMENTS-------------------
input: larry
algorithm: PBEWithMD5AndTripleDES
password: pkslow ----OUTPUT----------------------
xRvdeEnk7zgKtX5uVGCIug==

3.3 Java代码

既然是Java的库,那肯定能用Java代码来加密解密了。具体细节可以参考【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?

4 配置密文与其它项

4.1 配置密文

生成密文后,就要把密文配置在相应的位置,如下:

username: ENC(SUfiOs8MvmAUjg+oWl/6dQ==)

jasypt:
encryptor:
password: pkslow
algorithm: PBEWithMD5AndTripleDES

配置密文的默认格式:ENC(密文),这个格式可以通过jasypt.encryptor.property.prefixjasypt.encryptor.property.suffix配置,这里不再演示。

4.2 其它配置项

配置信息只有 jasypt.encryptor.password 是必须的,配置项有:

配置项 必须 Default Value
jasypt.encryptor.password True -
jasypt.encryptor.algorithm False PBEWITHHMACSHA512ANDAES_256
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.iv.RandomIvGenerator
jasypt.encryptor.stringOutputType False base64
jasypt.encryptor.proxyPropertySources False false

5 如何安放你的密钥

密钥是非常重要的信息,放在什么地方,决定着你的密文是否真的安全。可以有以下几类方式:

(1)放在application.properties

这样能获得配置文件的人就能知道密钥,不够安全。但它是一种方便简单的方式。存在密文和密钥放在同一个配置文件的风险。

(2)JVM参数

在启动Java程序时加参数:-Djasypt.encryptor.password=pkslow,这样就不会把密钥放在代码中去了。

(3)服务器的环境变量

把密钥放在linux系统的环境变量中去,只有能拿到服务器访问权限的人,才有可能知道密钥在哪。例如:

# 配置profile文件
export JASYPT_PASSWORD = pkslow # 生效
source /etc/profile # 运行java程序时
java -jar -Djasypt.encryptor.password=${JASYPT_PASSWORD} xxx.jar

(4)使用自定义的Encryptor来存放

以上我们都使用了官方提供的Encryptor,其实我们是可以自定义的,如下:

@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("password");
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;
}

把密钥写在代码里,只有能获得jar包并反编译的人,才能获得密文。

如果我们把密钥的一部分写在代码里,另一部分通过外部方式来配置,这样就会更加安全。

6 结果测试

我们已经完成了密文的生成,现在我们测试一下是否能正常解密,测试代码如下:

@RestController
@RequestMapping("/jasypt")
public class JasyptController {
@Value("${username}")
private String username; @GetMapping("/name")
public Mono<String> sendNormalText() {
return Mono.just(username);
}
}

访问该接口,能返回加密前的字符串,整个流程测试成功:

7 总结

本文简介了Springboot整合Jasypt实现配置信息的安全化,在实际项目中应用还是很多的。

另外,如果项目中是采用Spring Cloud Config的,它提供了统一的加解密方式,也方便使用。但如果应用配置没有走配置中心,还是应该使用Jasypt。


欢迎关注公众号<南瓜慢说>,将持续为你更新...

欢迎加博主微信,做一个点赞之友,哈哈...

多读书,多分享;多写作,多整理。

【Springboot】Springboot整合Jasypt,让配置信息安全最优雅方便的方式的更多相关文章

  1. SpringBoot SpringSecurity4整合,灵活权限配置,弃用注解方式.

    SpringSecurity 可以使用注解对方法进行细颗粒权限控制,但是很不灵活,必须在编码期间,就已经写死权限 其实关于SpringSecurity,大部分类都不需要重写,需要的只是妥善的配置. 每 ...

  2. SpringBoot整合Mybatis,TypeAliases配置失败的问题

    SpringBoot整合Mybatis,TypeAliases配置失败的问题 问题描述 在应用MyBatis时,使用对象关系映射,将对象和Aliase映射起来. 在Mybatis的文档明确写出,如果你 ...

  3. 靓仔,整合SpringBoot还在百度搜配置吗?老司机教你一招!!!

    导读 最近陈某公司有些忙,为了保证文章的高质量可能要两天一更了,在这里陈某先说声不好意思了!!! 昨天有朋友问我SpringBoot如何整合Redis,他说百度谷歌搜索了一遍感觉不太靠谱.我顿时惊呆了 ...

  4. SpringBoot 整合MyBatis 统一配置bean的别名

    所谓别名, 就是在mappper.xml配置文件中像什么resultType="xxx" 不需要写全限定类名, 只需要写类名即可. 配置方式有两种: 1. 在 applicatio ...

  5. SpringBoot 同时整合thymeleaf html、vue html和jsp

    问题描述 SpringBoot如何同时访问html和jsp SpringBoot访问html页面可以,访问jsp页面报错 SpringBoot如何同时整合thymeleaf html.vue html ...

  6. SpringBoot+Redis整合

    SpringBoot+Redis整合 1.在pom.xml添加Redis依赖 <!--整合Redis--> <dependency> <groupId>org.sp ...

  7. SpringBoot+Swagger整合API

    SpringBoot+Swagger整合API Swagger:整合规范的api,有界面的操作,测试 1.在pom.xml加入swagger依赖 <!--整合Swagger2配置类--> ...

  8. springboot+maven整合spring security

    springboot+maven整合spring security已经做了两次了,然而还是不太熟悉,这里针对后台简单记录一下需要做哪些事情,具体的步骤怎么操作网上都有,不再赘述.1.pom.xml中添 ...

  9. springboot下整合各种配置文件

    本博是在springboot下整合其他中间件,比如,mq,redis,durid,日志...等等  以后遇到再更.springboot真是太便捷了,让我们赶紧涌入到springboot的怀抱吧. ap ...

随机推荐

  1. 玩转VSCode-完整构建VSCode开发调试环境

    随着VSCode的不断完善和强大,是时候将部分开发迁移到VS Code中了. 目前使用VS2019开发.NET Core应用,一直有一个想法,在VS Code中复刻VS的开发环境,同时迁移到VS Co ...

  2. 深入理解计算机系统 第八章 异常控制流 Part1 第二遍

    第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了第 500~507 页,共 8 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/101651 ...

  3. MyBatis动态语句if与choose的区别

    if(通过“title”和“author”两个参数进行可选搜索): <select id="findActiveBlogLike" resultType="Blog ...

  4. Install aws cli

    下载 https://s3.amazonaws.com/aws-cli/AWSCLI64PY3.msi 添加环境变量

  5. vuejs之路由应用之一

    什么是‘路由’,路由相当于一个映射,一个url地址对应一个组件,当url地址A变为url地址B,那么对应地址A的组件就会改变为对应地址B的组件.应用于spa,即:单页应用,url地址改变,它不会跳转页 ...

  6. 20191031-5 beta week 1/2 Scrum立会报告+燃尽图 03

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9913 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...

  7. 网络爬虫一定要用代理IP吗

    数据采集现在已经成为大数据时代不可以缺少的一部分,在数据采集过程中,很多人都会用到代理ip,那么网络爬虫一定要用代理IP吗?答案虽然不是肯定的,但出现以下情况一定是需要用到代理IP的.1.在爬虫的时候 ...

  8. 2019-9-10:渗透测试,基础学习,sql注入笔记

    sql注入1,万能密码,自己写的网站,找到登录窗口,必须和数据库交互,往里插入构造的恶意代码,最后可以直接登录进去,不需要账号和密码,输入的恶意代码成为万能密码,后端拼接的sql语句,SELECT * ...

  9. Python使用场景和应用领域

    Python特点 1.Python使用C语言开发,但是Python不再有C语言中的指针等复杂的数据类型. 2.Python具有很强的面向对象特性,而且简化了面向对象的实现.它消除了保护类型.抽象类.接 ...

  10. NLP 语义相似度计算 整理总结

    更新中 最近更新时间: 2019-12-02 16:11:11 写在前面: 本人是喜欢这个方向的学生一枚,写文的目的意在记录自己所学,梳理自己的思路,同时share给在这个方向上一起努力的同学.写得不 ...