目录

Jasypt 加密概述

Jasypt 快速使用

StringEncryptor 加解密

Jasypt 配置详解


Jasypt 加密概述

1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,尽量不使用明文,要实现这一点,办法有很多,自己手动对敏感信息进行加解密也是可以的。

2、有需求就有人奉献,Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中使用特定格式直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。

1)Jasypt 加密属性配置格式:secret.property=ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+),ENC() 就是它的标识,程序启动的时候,会自动解密其中的内容,如果解密失败,则会报错。
2)所以获取这些属性值和平时没有区别,直接使用如 @Value("${secret.property}") 获取即可,取值并不需要特殊处理。

3、jasypt  同一个密钥(secretKey)对同一个内容执行加密,每次生成的密文都是不一样的,但是根据根据这些密文解密成原内容都是可以的.

4、jasypt 官网:https://github.com/ulisesbocchio/jasypt-spring-boot。

5、在项目中集成 jasypt-spring-boot 有三种方法:

方法一

1、如果是 Spring Boot 应用程序,使用了注解 @SpringBootApplication 或者 @EnableAutoConfiguration,那么只需添加 jasypt-spring-boot-starter 依赖,此时整个 Spring 环境就会支持可加密属性配置(这意味着任何系统属性、环境属性、命令行参数,yaml、properties 和任何其他自定义属性源可以包含加密属性):

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

方法二

1、如果没有使用 @SpringBootApplication 或者 @EnableAutoConfiguration,则将 jasypt-spring-boot 添加到类路径:

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

2、然后将 @EnableEncryptableProperties 添加到配置类中,以便在整个 Spring 环境中启用可加密属性:

@Configuration
@EnableEncryptableProperties
public class MyApplication {...
}

方法三

1、如果不使用 @SpringBootApplication 或者 @EnableAutoConfiguration 自动配置注解,并且不想在整个 Spring 环境中启用可加密的属性,则有本方法,首先将以下依赖项添加到项目中:

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

2、然后在配置文件中添加任意数量的 @EncryptablePropertySource 注解,就像使用 Spring 的 @PropertySource 注解一样:

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

3、或者还可以使用 @EncryptablePropertySources 注解来对 @EncryptablePropertySource 类型的注解进行分组:

@Configuration
@EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),@EncryptablePropertySource("classpath:encrypted2.properties")})
public class MyApplication {...
}

从 1.8 版起,@EncryptablePropertySource 支持 YAML 文件

Jasypt 快速使用

不管三七二十一,先入个门再说。

第一步

1、第一步就是要获取密文,就是将需要加密的数据进行加密,方法有很多,官方提供了 jar 包,可以从命令行操作,也可以直接使用代码进行加密。

2、推荐使用代码自己加密即可,下面提供一个工具类进行加密,注意事项:

1、Jasypt 默认使用 StringEncryptor 解密属性,所以加密时默认也得使用 StringEncryptor 加密,否则启动时解密失败报错
2、加密与解密对 StringEncryptor 设置的属性必须要一致,比如加密时使用什么算法,那么解密时也得一样,否则启动时解密失败报错
3、下面使用的加密算法为 "PBEWithMD5AndDES",官网默认的是 "PBEWITHHMACSHA512ANDAES_256",前者是 md5 加 des 标准加密,后者是 sha512 加 AES 高级加密。

4、如果想使用 “PBEWITHHMACSHA512ANDAES_256” 算法,需要 Java JDK 1.9 及以上支持,或者添加 JCE 无限强度权限策略文件,否则运行会报错:加密引发异常,一个可能的原因是您正在使用强加密算法,并且您没有在这个Java虚拟机中安装Java加密扩展(JCE)无限强权限策略文件。

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.PBEConfig;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.jasypt.util.text.BasicTextEncryptor;
/*** jasypt 加密工具类** @author wangmaoxiong* @version 1.0* @date 2020/5/29 8:46*/
public class JasyptUtils {/*** {@link StringEncryptor} 加解密。* 同一个密钥(secretKey)对同一个内容执行加密,生成的密文都是不一样的,但是根据根据这些密文解密成明文都是可以.* 1、Jasypt 默认使用 {@link StringEncryptor} 来解密全局配置文件中的属性,所以提供密文时,也需要提供 {@link StringEncryptor} 加密的密文* 2、{@link StringEncryptor} 接口有很多的实现类,比如常用的 {@link PooledPBEStringEncryptor}* 3、setConfig(final PBEConfig config):为对象设置 {@link PBEConfig} 配置对象* 4、encrypt(final String message):加密内容* 5、decrypt(final String encryptedMessage):解密内容** @param secretKey :密钥。加/解密必须使用同一个密钥* @param message   :加/解密的内容* @param isEncrypt :true 表示加密、false 表示解密* @return*/public static String stringEncryptor(String secretKey, String message, boolean isEncrypt) {PooledPBEStringEncryptor pooledPBEStringEncryptor = new PooledPBEStringEncryptor();pooledPBEStringEncryptor.setConfig(getSimpleStringPBEConfig(secretKey));String result = isEncrypt ? pooledPBEStringEncryptor.encrypt(message) : pooledPBEStringEncryptor.decrypt(message);return result;}/*** 设置 {@link PBEConfig} 配置对象,SimpleStringPBEConfig 是它的实现类* 1、所有的配置项建议与全局配置文件中的配置项保持一致,特别是 password、algorithm 等等选项,如果不一致,则应用启动时解密失败而报错.* 2、setPassword(final String password):设置加密密钥,必须与全局配置文件中配置的保存一致,否则应用启动时会解密失败而报错.* 3、setPoolSize(final String poolSize):设置要创建的加密程序池的大小.* 4、setAlgorithm(final String algorithm): 设置加密算法的值, 此算法必须由 JCE 提供程序支持* 5、setKeyObtentionIterations: 设置应用于获取加密密钥的哈希迭代次数。* 6、setProviderName(final String providerName):设置要请求加密算法的安全提供程序的名称* 7、setSaltGeneratorClassName:设置 Sal 发生器* 8、setIvGeneratorClassName:设置 IV 发生器* 9、setStringOutputType:设置字符串输出的编码形式。可用的编码类型有 base64、hexadecimal** @param secretKey* @return*/private static SimpleStringPBEConfig getSimpleStringPBEConfig(String secretKey) {SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(secretKey);config.setPoolSize("1");config.setAlgorithm("PBEWithMD5AndDES");config.setKeyObtentionIterations("1000");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");config.setStringOutputType("base64");return config;}public static void main(String[] args) throws Exception {String message = "2268461750@qq.com";String password = "wangmaox";//一个同样的密码和秘钥,每次执行加密,密文都是不一样的。但是解密是没问题的。String jasyptEncrypt = stringEncryptor(password, message, true);System.out.println(jasyptEncrypt);String jasyptEncrypt1 = stringEncryptor(password, "UVgGJ4BAS8XrVNsamg60RO0ADCzdCKuR2+bvINv7Wyej3YTqVmxp5g1", false);System.out.println(jasyptEncrypt1);}
}

2、可以直接从 main 方法运行,也可以提供一个 Controller 接口,从浏览器访问:

    /*** http://localhost:8080/jasypt/encrypt?secretKey=wangmx&message=修长城的民族&isEncrypt=true* 在线使用 {@link StringEncryptor} 加解密消息。** @param secretKey :密钥。加/解密必须使用同一个密钥* @param message   :加/解密的内容* @param isEncrypt :true 表示加密、false 表示解密* @return*/@GetMapping("jasypt/encrypt")public ObjectNode jasyptEncrypt(@RequestParam String secretKey, @RequestParam String message, @RequestParam boolean isEncrypt) {String encryptor = JasyptUtils.stringEncryptor(secretKey, message, isEncrypt);JsonNodeFactory nodeFactory = JsonNodeFactory.instance;ObjectNode objectNode = nodeFactory.objectNode();objectNode.put("code", 200);objectNode.put("secretKey", secretKey);objectNode.put("message", message);objectNode.put("isEncrypt", isEncrypt);objectNode.put("data", encryptor);return objectNode;}

第二步

1、全局配置文件中配置如下,必须设置 jasypt.encryptor.password 属性,algorithm 算法需要与加密时使用的算法一致。

2、想要对哪个属性进行加密,则使用 ENC() 包裹起来,然后里面放置密文即可,应用启动时会自动被解密。

jasypt:encryptor:password: wangmaox  #加密的密钥,自定义即可algorithm: PBEWithMD5AndDES  #指定解密算法author:infos:address: 长沙市天心区# Jasypt加密,格式为ENC(加密结果)email: ENC(gqtN4w5o5JrJR0armxigJ+L2HCfPYBVP3Q3rx7ImjDaIuwJA7eMRvw==)

3、对于 Spring Boot 应用,接着不用在做任何设置,程序里面正常取值即可,不用任何特殊处理,比如也可以对数据源的地址、账户、密码等进行加密,因为会自动解密,所以不需要担心取值问题。

@RestController
public class JasyptController {@Value("${author.infos.address}")private String authorAddress;@Value("${author.infos.email}")private String authorEmail;/*** 获取属性值* http://localhost:8080/jasypt/get** @return*/@GetMapping("/jasypt/get")public ObjectNode getJasypt() {JsonNodeFactory nodeFactory = JsonNodeFactory.instance;ObjectNode objectNode = nodeFactory.objectNode();objectNode.put("authorAddress", authorAddress);objectNode.put("authorEmail", authorEmail);return objectNode;}}

StringEncryptor 加解密

1、Jasypt 默认使用 StringEncryptor 解密属性,所以它默认就已经放置在了 Spring 容器中,可以直接获取使用,比如除了对配置文件中的属性加解密后,还可以做其它任何加解密操作,比如下面提供一个 Controller 接口用于在线加解密。

2、因为浏览器地址栏对于特殊字符比较敏感,所以不使用默认的 base64、而改为使用 16 进制字符串。

jasypt:encryptor:password: wangmaox  #加密的密钥,自定义即可,必填项algorithm: PBEWithMD5AndDES  #指定解密算法string-output-type: hexadecimal #设置加密内容输出的编码形式,可用的编码类型有 base64、hexadecimal(16进制)

3、然后想要使用 StringEncryptor  的地方直接获取使用即可。

    @Resourceprivate StringEncryptor stringEncryptor;/*** http://localhost:8080/jasypt/encryptor?message=12日下午17点执行任务&isEncrypt=true* http://localhost:8080/jasypt/encryptor?message=702EAA3755766C567F62E83273681A90DC684B6AFADD5CD84691778DAF4A1466E13CE0720E8BABC06081A5D6DBD90EA1&isEncrypt=false* 在线使用 {@link StringEncryptor} 加解密消息。** @param message   加/解密的内容* @param isEncrypt true 表示加密、false 表示解密* @return*/@GetMapping("jasypt/encryptor")public ObjectNode encrypt(@RequestParam String message, @RequestParam boolean isEncrypt) {JsonNodeFactory nodeFactory = JsonNodeFactory.instance;String encrypt = isEncrypt ? stringEncryptor.encrypt(message) : stringEncryptor.decrypt(message);ObjectNode objectNode = nodeFactory.objectNode();objectNode.put("code", 200);objectNode.put("data", encrypt);return objectNode;}

Jasypt 配置详解

1、Jasypt 默认使用 StringEncryptor 解密属性,如果在 Spring 上下文中找不到自定义的 StringEncryptor,则使用如下默认值:

配置属性 是否必填项 默认值
jasypt.encryptor.password True -
jasypt.encryptor.algorithm False PBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.key-obtention-iterations False 1000
jasypt.encryptor.pool-size False 1
jasypt.encryptor.provider-name False SunJCE
jasypt.encryptor.provider-class-name False null
jasypt.encryptor.salt-generator-classname False org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.iv-generator-classname False org.jasypt.iv.RandomIvGenerator
jasypt.encryptor.string-output-type False base64
jasypt.encryptor.proxy-property-sources False false
jasypt.encryptor.skip-property-sources False empty list

2、唯一需要的属性是 jasypt.encryptor.password ,其余的可以使用默认值。虽然所有这些属性都可以在属性文件中声明,但为了安全 password 属性官方不推荐存储在属性文件中,而应作为系统属性、命令行参数或环境变量传递。

3、官网默认加解密算法为 "PBEWITHHMACSHA512ANDAES_256",它是 sha512 加 AES 高级加密,需要 Java JDK 1.9 及以上支持,或者添加 JCE 无限强度权限策略文件,否则运行会报错:加密引发异常,一个可能的原因是您正在使用强加密算法,并且您没有在这个Java虚拟机中安装Java加密扩展(JCE)无限强权限策略文件。

此时换成 PBEWithMD5AndDES 算法即可,它是 md5 加 des 标准加密。

4、标准所有的 StringEncryptor 属性,都可以在全局配置文件中进行配置。也可以在后台添加 StringEncryptor bean,此时默认的加密程序将被忽略。

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*** @author wangmaoxiong* @version 1.0* @date 2020/5/29 15:24*/
@Configuration
public class AppConfig {/*** 自定义 StringEncryptor,覆盖默认的 StringEncryptor* bean 名称是必需的,从 1.5 版开始按名称检测自定义字符串加密程序,默认 bean 名称为:jasyptStringEncryptor** @return*/@Bean("jasyptStringEncryptor")public StringEncryptor jasyptStringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("wangmaox");config.setAlgorithm("PBEWithMD5AndDES");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;}
}

请注意,bean 名称是必需的,因为 jasypt spring boot 从 1.5 版开始按名称检测自定义字符串加密程序,默认 bean 名称为:jasyptStringEncryptor

但也可以通过定义属性来覆盖,例如 jasypt.encryptor.bean=encryptorBean,然后使用该名称定义自定义加密程序:

@Bean("encryptorBean") public StringEncryptor stringEncryptor() { ... }

后记:

1、更多内容参考 jasypt 官网:https://github.com/ulisesbocchio/jasypt-spring-boot。

2、也可以参考 https://blog.csdn.net/wangmx1993328/category_10026548.html

3、有人说 jasypt 加密的内容后台 @Value 取值时可以看到解密的值,或者说 debug 时能看到解密的值,对于开发人员来说自然是可以的,只要加密是可逆的,自然能下毒就能解毒。如果换成生产环境上,就无法 debug 看到明文了呀。

其实关键在于加密时使用的密钥(password),只要密钥不丢失,密文是有保障的,即便你告诉它使用的算法,它也无济于事,就像官方说的,密钥不推荐直接写在配置文件中,比如可以启动的时候,通过参数传入。

4、本文演示源码:

https://github.com/wangmaoxiong/h2Smil/blob/master/src/main/java/com/wmx/controller/JasyptController.java

https://github.com/wangmaoxiong/h2Smil/blob/master/src/main/java/com/wmx/utils/JasyptUtils.java

Jasypt 开源加密库使用教程相关推荐

  1. 如何创建一个开源Javascript库 | Lynda教程 中文字幕

    如何创建一个开源Javascript库 | Lynda教程 中文字幕 Creating an Open Source JavaScript Library 课程ID: 604269 时长: 5.5小时 ...

  2. 开源加密库和 GnuPG 模块 Libgcrypt 紧急修复严重漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 Libgcrypt 的开发人员发布紧急更新,解决该软件最新版本中的一个严重漏洞. Libgcrypt 是一款开源的加密库和 GNU P ...

  3. Java 加密库 Bouncy Castle安装使用教程

    Bouncy Castle 简介 Bouncy Castle 是一个流行的开源加密库,提供了丰富的密码学算法和安全性服务的实现.它以 Java 语言为基础,并支持许多不同的平台和编程语言. Bounc ...

  4. Mozilla 修复跨平台加密库 NSS 中的严重漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 Mozilla 修复了影响跨平台网络安全服务 (NSS) 加密库中一个严重的内存损坏漏洞 (CVE-2021-43527). NSS 可用于开发 ...

  5. [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】

    [教程]微信官方开源UI库-WeUI使用方法 [ 教程]微信官方开源UI库-WeUI使用方法 地址:http://www.weui.org.cn/?/article/1 微信公众号开发-WeUI使用说 ...

  6. FluorineFX开源库 使用教程(service配置xml说明)

    FluorineFX开源库 使用教程 字体大小: 小 中 大 作者: ddv | 分类: 网站开发 | 浏览: 401 | 评论: 暂时没有评论 转载请保留出处: DDV=敌敌畏 www.dplaye ...

  7. Jasypt加密库基本使用方法

    目录 1     Jasypt简介... 2     基础知识回顾... 3     Jasypt+基本加密器... 4     Jasypt+PBE加密器... 5     Jasypt+池化加密器 ...

  8. 仿迅雷播放器教程 -- C++ 100款开源界面库 (10)

    (声明:Alberl以后说到开源库,一般都是指著名的.或者不著名但维护至少3年以上的.那些把代码一扔就没下文的,Alberl不称之为开源库,只称为开源代码.这里并不是贬低,像Alberl前面那个系列的 ...

  9. 开源同态加密库 HEhub 发布|首个由国内隐私计算团队研发的(全)同态加密算法库...

    扫码关注 保护消费者权益 我们在行动 时至今日,数据要素已经成为数字经济时代最重要的生产要素之一,成为众多企业和机构的核心资产,而数据价值的体现依赖于数据的安全流通和利用.隐私计算作为新兴技术为数据的 ...

  10. 谷歌正式开源其多语言跨平台加密库Tink

    在谷歌,很多产品团队使用加密技术来保护用户数据.在加密技术领域,一个很细微的错误都会产生非常严重的后果.想要正确实现加密技术,可能需要先消化数十年的学术文献.毋庸置疑,很多开发人员没有这么多时间. 为 ...

最新文章

  1. PHP5 mysqli 教程
  2. 2019寒假作业二:PTA7-1币值转换
  3. 如何消除网站安全的七大风险
  4. HTML输入学生成绩并排序java_JS实现冒泡排序,插入排序和快速排序并排序输出...
  5. linux常用网络命令详解,linux网络命令详解(鸟哥)
  6. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
  7. ue4 如何获取端口号_尝试在UE4.22中实现罪恶装备Xrd的卡通渲染
  8. 告别大妈的灵魂拷问,Python 教你轻松完成垃圾分类!
  9. 【财务预警】基于matlab BP神经网络财务预警【含Matlab源码 494期】
  10. jsp汽车4S店维修管理系统
  11. Android平台语音交友软件源码开发,语音通话的实现
  12. mac安装php+mysql数据库_Mac环境下Nginx+PHP+MySQL的安装与配置
  13. 无敌破坏王2口碑爆棚,从街游到手游你最爱哪款游戏呢?
  14. 一个简单的敌人自动寻找玩家进行攻击及受到伤害死亡效果实现
  15. WebServer·(二)在IDEA中,安装配置Maven并且开发MavenHelloWorld
  16. CodeForces 332B Maximum Absurdity
  17. win7电脑最新版微信卡死问题的解决
  18. git上传代码的时候出现:Please tell me who you are.解决方法
  19. Mentor-dft 学习笔记 day24-Path Definition File
  20. 【狂神说Java】Redis最新超详细版教程通俗易懂1 2020-04-01:NoSQL分类,Redis Windows和Linux安装,性能测试,String,List,Set,Hash,Zset

热门文章

  1. IIS的Server Application Error报错解决方法
  2. HTTP Error 404 - File or Directory not found caused by ISAPI filter of Sharepoint
  3. GIST特征描述符使用
  4. 基于模拟退火算法求解TSP问题(JAVA)
  5. 孙鑫VC学习笔记:第十一讲 (六) 图形重绘方法二 利用元文件
  6. 编写python程序、利用循环输出1+11+111+1111_《JavaScript语法基础》练习第四章第五题练习...
  7. anaconda配置python_interpreter报错_MAC系统下SublimeText3 Python环境配置参考
  8. python从入门到实践课后答案-Python编程:从入门到实践(课后习题8)
  9. 拓端tecdat|t-GARCH 模型的贝叶斯推断理论
  10. Django一些常用操作记录