Jasypt加解密

这篇具有很好参考价值的文章主要介绍了Jasypt加解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Jasypt加密

引言

​ Jasypt也即Java Simplified EncryptionSourceforge.net上的一个开源项目。Jasypt 1.4的新特性包括:加密属性文件(encryptable properties files)、Spring Framework集成、加密Hibernate数据源配置、新的命令工具、URL加密的Apache wicket集成以及升级文档。

​ 根据Jasypt文档,该技术可用于加密任务与应用程序,例如:加密密码、敏感信息和数据通信、创建完整检查数据的sums、其他性能包括高安全性、基于标准的加密技术、可同时单向和双向加密的加密密码、文本、数字和二进制文件。Jasypt也可以与Acegi Security 整合也即Spring Security。Jasypt亦拥有加密应用配置的集成功能,而且提供一个开放的API从而任何一个Java Cryptography Extension都可以使用Jasypt。

​ Jasypt还符合RSA标准的基于密码的加密,并提供了无配置加密工具以及新的、高可配置标准的加密工具。

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

介绍

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

  • 注意:
    • jasypt.encryptor.saltGeneratorClassname新版和旧版属性不一致
    • jasypt.encryptor.algorithm加密算法不一致

1️⃣旧版

key REQUIRED DEFAULT VALUE
jasypt.encryptor.password True -
jasypt.encryptor.algorithm FALSE PBEWithMD5AndDES
jasypt.encryptor.keyObtentionlterations 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.NoOplVGenerator
jasypt.encryptor.stringOutputType FALSE base64
jasypt.encryptor.proxyPropertySources FALSE false

2️⃣新版

key REQUIRED DEFAULT VALUE
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

3️⃣需要注意加解密的类型一致

2.1.2版本默认加密方式为:PBEWithMD5AndDES
3.0.3版本默认加密方式为:PBEWITHHMACSHA512ANDAES_256
当引入3.0.3依赖,却没有添加相关jasypt加解密配置,而密文通过【PBEWithMD5AndDES】来加密,启动会报错。
需要切换为【PBEWITHHMACSHA512ANDAES_256】方式进行。

整合SpringBoot

引入依赖

<!-- 方式1:引入 jasypt-spring-boot-starter -->
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>

<!-- 方式2:引入 jasypt-spring-boot  需在启动类添加@EnableEncryptableProperties -->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot</artifactId>
    <version>2.0.0</version>
</dependency>

编写配置

jasypt:
  encryptor:
    algorithm: PBEWithMD5AndDES # 加密算法
    password: cf150b74e4824146ad76e9ebe757ba76 # 使用加密密钥

加密和解密

通过Java程序获取密文和解密

@Autowired
private StringEncryptor stringEncryptor;

@Test
public void test() {
    String secret = stringEncryptor.encrypt("root");
    String decrypt = stringEncryptor.decrypt(secret);
    System.out.println("password明文:" + decrypt);
    System.out.println("password密文:" + secret);
}

/**
 * StandardPBEStringEncryptor对象的setPassword方法设置盐值(密钥)
 */
@Test
public void test(){
    StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
    encryptor.setPassword("hello");//设置加密盐值
    String secret = stringEncryptor.encrypt("root");
    String decrypt = stringEncryptor.decrypt(secret);
    System.out.println("password明文:" + decrypt);
    System.out.println("password密文:" + secret);
}
  • 自己封装的工具类
/**
 * Jasypt加密解密工具类
 */
public class JasyptUtil {

    private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";

    private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";

    /**
     * @param text  待加密原文
     * @param crack 盐值(密钥)
     * @return 加密后的字符串
     * @Description: Jasypt加密(PBEWithMD5AndDES)
     */
    public static String encryptWithMD5(String text, String crack) {
        //1.创建加解密工具实例
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        //2.加解密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm(PBEWITHMD5ANDDES);
        config.setPassword(crack);
        encryptor.setConfig(config);
        //3.加密
        return encryptor.encrypt(text);
    }

    /**
     * @param text  待解密原文
     * @param crack 盐值(密钥)
     * @return 解密后的字符串
     * @Description: Jasypt解密(PBEWithMD5AndDES)
     */
    public static String decryptWithMD5(String text, String crack) {
        //1.创建加解密工具实例
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        //2.加解密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm(PBEWITHMD5ANDDES);
        config.setPassword(crack);
        encryptor.setConfig(config);
        //解密
        return encryptor.decrypt(text);
    }

    /**
     * @param text  待加密的原文
     * @param crack 盐值(密钥)
     * @return 加密后的字符串
     * @Description: jasypt 加密(PBEWITHHMACSHA512ANDAES_256)
     */
    public static String encryptWithSHA512(String text, String crack) {
        //1.创建加解密工具实例
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        //2.加解密配置
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(crack);
        config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
        // 为减少配置文件的书写,以下都是 Jasypt 3.x 版本,配置文件默认配置
        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);
        //3.加密
        return encryptor.encrypt(text);
    }

    /**
     * @param text  待解密原文
     * @param crack 盐值(密钥)
     * @return 解密后的字符串
     * @Description: jasypt 解密(PBEWITHHMACSHA512ANDAES_256)
     */
    public static String decryptWithSHA512(String text, String crack) {
        //1.创建加解密工具实例
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        //2.加解密配置
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(crack);
        config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
        // 为减少配置文件的书写,以下都是 Jasypt 3.x 版本,配置文件默认配置
        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);
        //3.解密
        return encryptor.decrypt(text);
    }
}

通过jasypt中jar包程序获取密文

1️⃣添加依赖,下载好jar包到本地maven仓库后,cmd进入jasypt.jar包所在的目录

如个人本地目录:D:\Java\mvn_repository\org\jasypt\jasypt\1.9.3

2️⃣加密命令,参数说明:

  • input:需要加密的字段
  • password:加密盐值,用来进行加密
  • algorithm:加密方式,默认不写也行
命令:java -cp jasypt-1.9.3.jar  org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=hello algorithm=PBEWithMD5AndDES

# 输出
----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.171-b11

----ARGUMENTS-------------------
algorithm: PBEWithMD5AndDES
input: root
password: hello

----OUTPUT----------------------
muiQcX1aXcMACgnq57hDDA==

3️⃣解密命令

java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="aCEx6r9g2lBuGF8w/XU8wQ==" password=hello algorithm=PBEWithMD5AndDES

#输出
----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.171-b11

----ARGUMENTS-------------------
algorithm: PBEWithMD5AndDES
input: muiQcX1aXcMACgnq57hDDA==
password: hello

----OUTPUT----------------------
root

使用密文:ENC(密文)

1️⃣如:数据库连接加密

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: ENC(muiQcX1aXcMACgnq57hDDA==)  # 明文=root

2️⃣重要内容加密

my:
  username: ENC(muiQcX1aXcMACgnq57hDDA==) # 明文=root
  password: ENC(muiQcX1aXcMACgnq57hDDA==) # 明文=root

异常问题

JCE权限问题

org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. 
A possible cause is you are using strong encryption algorithms and you have not installed the Java 
Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine

# 解决方案:
查看是否是加解密类型不一致导致。
或者下载:https://www.oracle.com/java/technologies/javase-jce8-downloads.html
下载压缩包解压,将local_policy.jar和US_export_policy.jar替换(或粘贴进去)D:\Java\JDK8\jre\lib\security\路径下的jar包

yml中带有@引起的问题

yml中@是特殊字符, 含有@左右需要加单引号。
jasypt 自动加密整个文件的时候,会将单引号也当做密码的一部分,这样得到的密文肯定是错的。

#解决方案:
直接将密码生成,然后再复制过去,不要带双引号。

关于盐值(密钥)配置设置

  • 存放位置

    • 工程内配置文件中
    • 内部代码中
    • 存放本地某处目录下的本地文件中
  • 传入盐值

    • 盐值明文存放到工程内配置文件存在安全风险。

    • 存放本地某处目录下的本地文件中(推荐)

    • 存放内部代码中。

    • 在程序启动时,配置参数传入。

1️⃣在程序启动时,配置参数传入。

  • 通过启动时传入密钥【Add VM options】
-Djasypt.encryptor.password=cf150b74e4824146ad76e9ebe757ba76

Jasypt加解密

2️⃣命令行启动jar包时,传入命令文章来源地址https://www.toymoban.com/news/detail-419648.html

其他

  • 不自定义加密类的话,默认算法为 PBEWithMD5AndDES
  • 多次生成,每次生成的密码不一样。不同的密码序列,解密却可以一样。
  • ENC前缀可改变,即自定义格式:需要添加配置
jasypt:
  encryptor:
    property:
      prefix: "P["
      suffix: "]"
      
my:
  username: P[muiQcX1aXcMACgnq57hDDA==] # 明文=root
  password: P[muiQcX1aXcMACgnq57hDDA==] # 明文=root

到了这里,关于Jasypt加解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jasypt加解密

    ​ Jasypt也即 Java Simplified Encryption 是 Sourceforge.net 上的一个开源项目。Jasypt 1.4的新特性包括:加密属性文件(encryptable properties files)、Spring Framework集成、加密Hibernate数据源配置、新的命令工具、URL加密的Apache wicket集成以及升级文档。 ​ 根据Jasypt文档,该技术可用于加密任务

    2023年04月20日
    浏览(21)
  • 配置文件信息加解密方案(jasypt)

    参考: jasypt 的 GitHub 官方网址 jasypt加密 Jasypt 开源加密库使用教程 SpringBoot配置文件中密码属性加密 Jasypt 全称 Java Simplified Encryption ,是 Sourceforge.net 上的一个开源项目。 Jasypt 可用于加密任务与应用程序,例如加密密码、敏感信息和数据通信,还包括高安全性、基于标准的加

    2023年04月08日
    浏览(26)
  • Jasypt 数据库及中间件密码加解密

    9一、引入jar包 二、新增JasyptUtils工具类 三、修改application.yml 将加密后密码替换值yml文件ENC()括号内

    2024年02月13日
    浏览(36)
  • spring boot集成jasypt 并 实现自定义加解密

    由于项目中的配置文件 配置的地方过多,现将配置文件统一放到nacos上集中管理 且密码使用加密的方式放在配置文件中 项目中组件使用的版本环境如下 spring cloud 2021.0.5 spring cloud alibaba 2021.0.5.0 spring boot 2.6.13 配置文件的加密使用 加密库 jasypt 引入maven依赖 添加配置 使用jasy

    2024年02月11日
    浏览(33)
  • SpringBoot使用Jasypt对配置文件加密、数据库密码加密

    Dmo源码请点这里! Jasypt是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。jasypt库与springboot集成,在实际开发中非常方便。 1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进

    2024年04月28日
    浏览(31)
  • 微服务SpringBoot整合Jasypt加密工具

    Jasypt是Java加密工具包,能支持对密码的哈希加密,对文本和二进制数据的对称加解密,还能集成SpringBoot项目对配置文件中的密钥进行加密存储。 引入依赖如下: 2.1 密码加密场景 用户注册账户的时候需要输入密码,我们将密码加密后保存到数据库中,保证用户的敏感数据的

    2024年02月02日
    浏览(29)
  • 使用jasypt对springboot配置信息加密

    jasypt密码可以放到配置文件或者启动命令中,与其这样不如直接写到代码里 注意:上面的@Primary 注解必须加上,覆盖默认实现。 将加密后的信息用前面用 ENC( ) 包起来 例如: 原始配置: 改成: (完) 参考: [1] https://zhuanlan.zhihu.com/p/480828512 [2] https://github.com/ulisesbocchio/jasypt-sp

    2024年02月05日
    浏览(30)
  • 加密组件Jasypt学习、实战及踩坑记录

    最近入职新公司,因几乎全部项目都使用到jasypt,故而初步学习记录下本文(持续更新)。 官网及GitHub给出的简介:使用简单,性能好,特性features非常丰富;支持 另,有个开源Jasypt-spring-boot组件,GitHub,集成Jasypt,方便Spring Boot开发者使用。 开发中最常见的场景就是对数据

    2023年04月16日
    浏览(32)
  • spring项目本地配置及nacos远端配置的解密(不依赖jasypt框架)

    locator:NacosDecryptPropertySourceLocator.java 继承NacosPropertySourceLocator并重写locate方法,在nacos自身的热更新配置置入propertySources前将解密后的propertySource放入spring更新environment的队列(spring在更新environment时遇到同名的propertySource会优先选择更早放入的,所以本功能为@Order(-1),在正常的

    2024年02月14日
    浏览(24)
  • 微服务nacos或者yml配置内容部分加密jasypt

    1.引入依赖(版本自定): 2.yml新增配置: 注:algorithm是加密算法,官方默认的加密算法是 PBEWITHHMACSHA512ANDAES_256,但是如果你用的是 JDK1.8,还用不了这个算法,JDK9以上才支持,所以可以把这个算法改成PBEWithMD5AndDES。 2.1.2版本默认加密方式为:PBEWithMD5AndDES 3.0.3版本默认加密

    2024年02月10日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包