精华内容
下载资源
问答
  • jasypt-spring-boot 用于Spring Boot 1.4.X,1.5.X和2.0.X的集成 Jasypt Spring Boot为Spring Boot应用程序中的属性源提供了加密支持。 有3种方法可以将jasypt-spring-boot集成到您的项目中: 如果使用@...
  • 主要介绍了SpringBoot项目整合jasypt实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了SpringBoot 集成 Jasypt 对数据库加密以及踩坑,需要的朋友可以参考下
  • jasypt-spring-boot, Spring Boot的Jasypt集成 jasypt-spring-boot为 Spring Boot 1.4. X 。1.5. X 和 2.0.0.x 提供收费的Jasypt 集成 Jasypt Spring Boot 为 Spri
  • jasypt加密工具

    2017-12-22 13:26:08
    jasypt 加密工具,采用md5规则,可自定义秘钥,实用小工具。 直接java -jar进行启动即可
  • Jasypt GUI 屏幕截图 加密 解密 如何使用 下载 运行java -jar jasypt-gui.jar 如何建造 git clone https://github.com/fahrinh/jasypt-gui cd jasypt-gui mvn clean package # an executable jar is located at ...
  • springboot整合jasypt所需要全部jar包: jasypt-1.9.2.jar、jasypt-spring-boot-starter-1.14.jar。
  • jasypt

    2021-04-29 18:04:29
    1:首先把这个文件:jasypt-1.9.2.jar 放到电脑的某个文件夹https://mvnrepository.com/artifact/org.jasypt/jasypt/1.9.3 2:打开电脑的cmd窗口(电脑的win+R 快捷键),在弹出一个框,输入cmd 回车即可。 3:在第2...

    1:首先把这个文件:jasypt-1.9.2.jar 放到电脑的某个文件夹https://mvnrepository.com/artifact/org.jasypt/jasypt/1.9.3
    2:打开电脑的cmd窗口(电脑的win+R 快捷键),在弹出一个框,输入cmd 回车即可。
    3:在第2步打开的cmd窗口中,把当且切换目录到第1步文件:jasypt-1.9.2.jar 所在的目录
    4:切换到相应的目录后:输入文件:数据库密码加密方式.txt里面的命令(大小写一定要区分)
    5:配置文件yml:

    
    jasypt:
      encryptor:
        password: admincloudphone
    
    username: ENC(zlFFe6S9yZ)
    password: ENC(uBneQ/I0NPmx65)
    

    一定要ENC(****)

    6:最后OUT下面的就是密文:如下图
    在这里插入图片描述

    展开全文
  • NULL 博文链接:https://yunlong167167.iteye.com/blog/2403750
  • Jasypt开发团队推出了Java加密工具Jasypt 1.4,它可与Spring Framework、Hibernate和Acegi Security集成。 Jasypt 1.4的新特征包括:加密属性文件(encryptable properties files)、Spring Framework集成、加密...
  • jasypt1.9.2&jce1.6-1.8

    2016-11-27 22:45:10
    Jasypt这个Java类包为开发人员提供一种简单的方式来为项目增加加密功能,包括:密码Digest认证,文本和对象加密,集成hibernate,Spring Security(Acegi)来增强密码管理。 更多资源详见: ...
  • jasypt-1.9.2.jar

    2020-06-05 17:16:55
    springboot整合jasypt所需要全部jar包: jasypt-1.9.2.jar、jasypt-spring-boot-starter-1.14.jar。
  • spring-boot-jasypt-源码

    2021-03-05 22:52:24
    春天引导jasypt
  • java -jar jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI输入=世界密码= ncsoft算法= PBEWITHSHA256AND128BITAES-CBC-BC 问题 如果遇到问题消息“ java.security.NoSuchProviderException:...
  • 今天小编就为大家分享一篇关于在SpringBoot中通过jasypt进行加密解密的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • jasypt.jar

    2013-05-31 14:14:31
    http://jarfiles.pandaidea.com/jasypt.html 如果你还需要其它版本的,可以从前面这个链接上下载。
  • 主要给大家介绍了关于利用Jasypt如何对Spring Boot配置文件加密的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Jasypt

    2019-07-18 09:13:01
    引入依赖 <dependency> <groupId>com.github.ulisesbocchio</groupId> <...jasypt-spring-boot-starter</artifactId> <version>2.1.1</version> </...
    1. 引入依赖
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>2.1.1</version>
    </dependency>
    
    1. 加密
    BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();
    basicTextEncryptor.setPassword(salt);
    String encStr = basicTextEncryptor.encrypt(value);
    
    1. yml
    jasypt.encryptor.password=anxin
    spring.datasource.username=ENC(M03mB3zzuFAp+PuU/Ab0cQ==)
    
    1. salt配置在环境变量
      打开/etc/profile文件
    vim /etc/profile
    

    文件末尾插入

    export JASYPT=anxin
    

    编译

    source /etc/profile
    
    1. 部署时配置salt
    • -Djasypt.encryptor.password=anxin
    • –jasypt.encryptor.password=anxin
    • –jasypt.encryptor.password=${JASYPT}
    展开全文
  • 这是一个可以直接运行的jar,提供简单gui界面,使用jasypt进行加密解密的小工具
  • 这个是用于给hibernate的配置文件加密使用的 jasypt加密_spring整合.zip
  • jasypt-spring-boot代码

    2019-04-26 00:39:18
    jasypt Spring Boot provides Encryption support for property sources in Spring Boot Applications. There are 3 ways to integrate jasypt-spring-boot in your project:
  • 文章目录摘要Jasypt 简介Jasypt 特征下载 JasyptJasypt 环境依赖要求Jasypt 用法简单用法:utils一般用法使用精简版 Jasypt从命令行加密:Jasypt CLI 工具高级用法加密器和摘要器的高级配置Web PBE Configuration将 ...

    摘要

    博主写作此文时,该软件的最新版本为:Jasypt 1.9.3 RELEASED

    Jasypt 简介

    Jasypt 是一个 Java 库,它允许开发人员以最小的努力为项目添加基本的加密功能,而无需深入了解密码学的工作原理。

    Jasypt 特征

    • Jasypt 提供简单的单向(摘要)和双向加密技术。
    • 用于任何 JCE 提供程序的开放 API,而不仅仅是默认的 Java VM 提供程序。 Jasypt 可以很容易地与 Bouncy Castle 等知名提供商一起使用。
    • 为您的用户密码提供更高的安全性。
    • 二进制加密支持。 Jasypt 允许对二进制文件(字节数组)进行摘要和加密。 在需要时加密您的对象或文件(例如通过网络发送)。
    • 数值加密支持。 除了文本和二进制文件,它还允许对数值进行摘要和加密(BigInteger 和 BigDecimal,加密 Hibernate 持久性时支持其他数字类型)。
    • 完全线程安全。
    • 支持加密/摘要池,以在多处理器/多核系统中实现高性能。
    • 包括库的轻量级(“精简”)版本,以便在移动平台等大小受限的环境中具有更好的可管理性。
    • 为加密新手提供简单、无需配置的加密工具,也为高级用户提供高度可配置的标准加密工具。
    • Hibernate 3、4 和 5 可选集成,用于以加密方式持久化映射实体的字段。 字段加密在 Hibernate 映射文件中定义,它对应用程序的其余部分保持透明(对于敏感的个人数据、具有许多已启用读取的用户的数据库…)。 加密文本、二进制文件、数字、布尔值、日期…
    • 无缝集成到 Spring 应用程序中,具有适用于 Spring 2、Spring 3.0、Spring 3.1 和 Spring 4.0 的特定集成功能。 jasypt 中的所有摘要器和加密器都设计为易于从 Spring 使用(实例化、依赖注入…)。 而且,由于它们是线程安全的,因此它们可以在像 Spring 这样的面向单例的环境中使用而无需担心同步问题。
    • Spring Security(原Acegi Security)可选集成,用于为安全框架执行密码加密和匹配任务,通过使用更安全的密码加密机制来提高用户密码的安全性,并为您提供更高程度的配置和控制。
    • 提供用于加密全部或部分应用程序配置文件的高级功能,包括数据库密码等敏感信息。 将加密配置无缝集成到普通的、基于 Spring 的和/或支持 Hibernate 的应用程序中。
    • 提供易于使用的 CLI(命令行界面)工具,允许开发人员初始化他们的加密数据,并在维护任务或脚本中包含加密/解密/摘要操作。
    • 集成到 Apache Wicket 中,以在您的安全应用程序中对 URL 进行更强大的加密。
    • 全面的指南和 javadoc 文档,使开发人员能够更好地了解他们真正对数据做了什么。
    • 强大的字符集支持,旨在充分加密和摘要文本,无论原始字符集是什么。 完全支持日语、韩语、阿拉伯语等语言,没有编码或平台问题。
    • 非常高级的配置功能:开发人员可以实施一些技巧,例如指示“加密器”向远程 HTTPS 服务器询问用于加密的密码。 它可以让您满足您的安全需求。

    下载 Jasypt

    从GitHub下载Jasypt
    使用Maven下载Jasypt
    Spring Boot 集成 Jasypt

    Jasypt 环境依赖要求

    Java Virtual Machine

    • Jasypt 需要 Java 标准版 1.6 或更高版本。
    • 如果您打算使用强加密算法(如 TripleDES),您可能需要下载并安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files

    Jasypt 的基本依赖项

    • 从 1.7 版开始,jasypt 在与 Java 6 版或更高版本一起使用时不依赖于任何外部库。
    • 如果您使用 Java SE 5 或更旧的版本作为较旧的 Jasypt 版本(小于 1.9.3),您将需要:International Components for Unicode (ICU) 3.4.4 或者更高版本。
    • 另请注意,从 jasypt 1.8 开始,ICU (icu4j) 将用于规范化 Unicode,如果它存在于类路径中,即使使用 Java >= 6(尽管如此,icu4j 和 java.text.Normalizer 实现是完全兼容的)。

    Jasypt 用法

    简单用法:utils

    使用 Jasypt 的最简单方法是使用其简单的加密工具,称为 utils,因为它们位于 org.jasypt.util 包中。

    它们被称为 utils,因为它们是现成的、预先配置的摘要器和加密器,您可以在不了解其配置的情况下使用它们。

    这些实用程序根据它们要执行的任务进行分类:

    • 一般摘要(org.jasypt.util.digest.*)
    • 密码加密(摘要)(org.jasypt.util.password.*)
    • 文本加密 (org.jasypt.util.text.*)
    • 数字加密 (org.jasypt.util.numeric.*)
    • 二进制加密 (org.jasypt.util.binary.*)

    提 示 : \color{red}{提示:} 请注意,一般来说,当我们谈论“密码加密”时,我们实际上是在谈论“密码摘要”,这是技术上正确的术语。

    一般摘要

    1. org.jasypt.util.digest.Digester 在二进制级别执行消息摘要,其结果等同于从 java.security.MessageDigest 对象获得的结果,尽管以线程安全的方式运行并实现更合适的接口 用于以 bean 为中心的环境。
    ...
    Digester digester = new Digester();
    digester.setAlgorithm("SHA-1");
    ...
    byte[] digest = digester.digest(message);
    

    密码加密(摘要)

    这里的所有类都实现了 org.jasypt.util.password.PasswordEncryptor 接口,以便它们可以在需要时互换使用。

    1. org.jasypt.util.password.BasicPasswordEncryptor 可用于在用户注册时加密密码并在用户登录时检查输入密码。
    ...
    BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor();
    String encryptedPassword = passwordEncryptor.encryptPassword(userPassword);
    ...
    if (passwordEncryptor.checkPassword(inputPassword, encryptedPassword)) {
      // correct!
    } else {
      // bad login!
    }
    ...
    
    1. org.jasypt.util.password.StrongPasswordEncryptor 实现了比 PasswordEncryptor 更高的密码安全性(计算成本更高)。
    ...
    StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor();
    String encryptedPassword = passwordEncryptor.encryptPassword(userPassword);
    ...
    if (passwordEncryptor.checkPassword(inputPassword, encryptedPassword)) {
      // correct!
    } else {
      // bad login!
    }
    ...
    
    1. org.jasypt.util.password.ConfigurablePasswordEncryptor 允许开发人员决定要使用的算法,以及他/她是否想要应用完整的安全密码加密机制(如此处所述),还是为遗留集成生成一个简单的摘要 原因。
    ...
    ConfigurablePasswordEncryptor passwordEncryptor = new ConfigurablePasswordEncryptor();
    passwordEncryptor.setAlgorithm("SHA-1");
    passwordEncryptor.setPlainDigest(true);
    String encryptedPassword = passwordEncryptor.encryptPassword(userPassword);
    ...
    if (passwordEncryptor.checkPassword(inputPassword, encryptedPassword)) {
      // correct!
    } else {
      // bad login!
    }
    ...
    

    文本加密

    这里的所有类都实现了 org.jasypt.util.text.TextEncryptor 接口,以便在需要时可以互换使用它们。

    1. org.jasypt.util.text.BasicTextEncryptor 允许用户使用正常强度算法加密和解密文本数据。 为了能够加密和解密,这个加密器必须先设置密码。
    ...
    BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
    textEncryptor.setPassword(myEncryptionPassword);
    ...
    String myEncryptedText = textEncryptor.encrypt(myText);
    ...
    String plainText = textEncryptor.decrypt(myEncryptedText);
    ...
    
    1. org.jasypt.util.text.StrongTextEncryptor 允许用户使用高强度算法加密和解密文本数据。 (您可能需要下载并安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 才能使用它)。 为了能够加密和解密,这个加密器必须先设置密码。
    ...
    StrongTextEncryptor textEncryptor = new StrongTextEncryptor();
    textEncryptor.setPassword(myEncryptionPassword);
    ...
    String myEncryptedText = textEncryptor.encrypt(myText);
    ...
    String plainText = textEncryptor.decrypt(myEncryptedText);
    ...
    

    提 示 : \color{red}{提示:} 更高的安全性:AES256TextEncryptor 实用程序类具有更安全的算法:PBEWithHMACSHA512AndAES_256,(您至少需要 Java 8 才能使用它):

    ...
    AES256TextEncryptor textEncryptor = new AES256TextEncryptor();
    textEncryptor.setPassword(myEncryptionPassword);
    ...
    String myEncryptedText = textEncryptor.encrypt(myText);
    ...
    String plainText = textEncryptor.decrypt(myEncryptedText);
    ...
    

    数值加密

    这里的所有类都实现了 org.jasypt.util.numeric.DecimalNumberEncryptor 或 org.jasypt.util.numeric.IntegerNumberEncryptor 接口,以便它们可以在需要时互换使用。

    1. org.jasypt.util.numeric.BasicIntegerNumberEncryptor 允许用户使用正常强度算法加密和解密 BigInteger 对象。 为了能够加密和解密,这个加密器必须先设置密码。
    ...
    BasicIntegerNumberEncryptor integerEncryptor = new BasicIntegerNumberEncryptor();
    integerEncryptor.setPassword(myEncryptionPassword);
    ...
    BigInteger myEncryptedNumber = textEncryptor.encrypt(myNumber);
    ...
    BigInteger plainNumber = textEncryptor.decrypt(myEncryptedNumber);
    ...
    
    1. org.jasypt.util.numeric.StrongIntegerNumberEncryptor 允许用户使用高强度算法加密和解密 BigInteger 对象。 (您可能需要下载并安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 才能使用它)。 为了能够加密和解密,这个加密器必须先设置密码。
    ...
    StrongIntegerNumberEncryptor integerEncryptor = new StrongIntegerNumberEncryptor();
    integerEncryptor.setPassword(myEncryptionPassword);
    ...
    BigInteger myEncryptedNumber = integerEncryptor.encrypt(myNumber);
    ...
    BigInteger plainNumber = integerEncryptor.decrypt(myEncryptedNumber);
    ...
    

    提 示 : \color{red}{提示:} 更高的安全性:AES256DecimalNumberEncryptor 实用程序类具有更安全的算法:PBEWithHMACSHA512AndAES_256,(您至少需要 Java 8 才能使用它):

    ...
    BigInteger myNumber = ...;
    ...
    AES256IntegerNumberEncryptor numberEncryptor = new AES256IntegerNumberEncryptor();
    numberEncryptor.setPassword(myEncryptionPassword);
    ...
    BigInteger myEncryptedNumber = numberEncryptor.encrypt(myNumber);
    ...
    BigInteger plainNumber = numberEncryptor.decrypt(myEncryptedNumber);
    ...
    
    1. org.jasypt.util.numeric.BasicDecimalNumberEncryptor 允许用户使用正常强度算法加密和解密 BigDecimal 对象。 为了能够加密和解密,这个加密器必须先设置密码。
    ...
    BasicDecimalNumberEncryptor decimalEncryptor = new BasicDecimalNumberEncryptor();
    decimalEncryptor.setPassword(myEncryptionPassword);
    ...
    BigDecimal myEncryptedNumber = decimalEncryptor.encrypt(myNumber);
    ...
    BigDecimal plainNumber = decimalEncryptor.decrypt(myEncryptedNumber);
    ...
    
    1. org.jasypt.util.numeric.StrongDecimalNumberEncryptor 允许用户使用高强度算法加密和解密 BigDecimal 对象。 (您可能需要下载并安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 才能使用它)。 为了能够加密和解密,这个加密器必须先设置密码。
    ...
    StrongDecimalNumberEncryptor decimalEncryptor = new StrongDecimalNumberEncryptor();
    decimalEncryptor.setPassword(myEncryptionPassword);
    ...
    BigDecimal myEncryptedNumber = decimalEncryptor.encrypt(myNumber);
    ...
    BigDecimal plainNumber = decimalEncryptor.decrypt(myEncryptedNumber);
    ...
    

    提 示 : \color{red}{提示:} 更高的安全性:AES256DecimalNumberEncryptor 实用程序类具有更安全的算法:PBEWithHMACSHA512AndAES_256,(您至少需要 Java 8 才能使用它):

    ...
    BigDecimal myNumber = ...;
    ...
    AES256DecimalNumberEncryptor numberEncryptor = new AES256DecimalNumberEncryptor();
    numberEncryptor.setPassword(myEncryptionPassword);
    ...
    BigDecimal myEncryptedNumber = numberEncryptor.encrypt(myNumber);
    ...
    BigDecimal plainNumber = numberEncryptor.decrypt(myEncryptedNumber);
    ...
    

    二进制加密

    这里的所有类都实现了 org.jasypt.util.binary.BinaryEncryptor 接口,以便它们可以在需要时互换使用。

    1. org.jasypt.util.binary.BasicBinaryEncryptor 允许用户使用正常强度算法加密和解密 byte[] 对象。 为了能够加密和解密,这个加密器必须先设置密码。
    ...
    BasicBinaryEncryptor binaryEncryptor = new BasicBinaryEncryptor();
    binaryEncryptor.setPassword(myEncryptionPassword);
    ...
    byte[] myEncryptedBinary = binaryEncryptor.encrypt(myBinary);
    ...
    String plainBinary = binaryEncryptor.decrypt(myEncryptedBinary);
    ...
    
    1. org.jasypt.util.binary.StrongBinaryEncryptor 允许用户使用高强度算法加密和解密 byte[] 对象。 (您可能需要下载并安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 才能使用它)。 为了能够加密和解密,这个加密器必须先设置密码。
    ...
    StrongBinaryEncryptor binaryEncryptor = new StrongBinaryEncryptor();
    binaryEncryptor.setPassword(myEncryptionPassword);
    ...
    byte[] myEncryptedBinary = binaryEncryptor.encrypt(myBinary);
    ...
    String plainBinary = binaryEncryptor.decrypt(myEncryptedBinary);
    ...
    

    提 示 : \color{red}{提示:} 更高的安全性:AES256BinaryEncryptor 实用程序类具有更安全的算法:PBEWithHMACSHA512AndAES_256,(您至少需要 Java 8 才能使用它):

    ...
    AES256BinaryEncryptor binaryEncryptor = new AES256BinaryEncryptor();
    binaryEncryptor.setPassword(myEncryptionPassword);
    ...
    byte[] myEncryptedBytes = binaryEncryptor.encrypt(myBytes);
    ...
    byte[] plainBytes = binaryEncryptor.decrypt(myEncryptedBytes);
    ...
    

    一般用法

    本节将教您有关 jasypt 为您提供的工具,当在简单使用页面中找到的简单实用程序不足以满足您的需求时。

    Digesters

    Digesters 是专门用于从输入创建消息摘要(也称为散列)的类。

    消息摘要是摘要(或哈希)函数的结果,它们是单向的,也就是说,从消息摘要开始,原始消息无法重构。

    因此,消息摘要非常适合密码加密。 事实上,在某些国家/地区,以未加密的方式存储用户密码,甚至以可逆(双向)方式加密都是违法的。

    jasypt 中的消化器位于 org.jasypt.digest 包中,该包由以下接口组成:

    • ByteDigester 用于从字节数组输入创建摘要。
    • StringDigester 用于从字符串输入创建摘要。

    以及以下标准实现:

    • StandardByteDigester:ByteDigester 的可配置性和极其安全的实现,按照 PKCS #5:基于密码的加密标准中给出的指令实现。
    • StandardStringDigester:与 StandardByteDigester 对应的字符串,接收字符串输入并返回字符集安全、BASE64(或十六进制)编码的字符串输出。

    及其相应的基于池的实现,可在多处理器/多核系统中实现高性能:

    • PooledByteDigester:与 StandardByteDigester 相同的 API,但实际上包含这些对象的池,用于在循环中提供摘要/检查请求。
    • PooledStringDigester:与 StandardStringDigester 相同的 API,但实际上包含这些对象的池,用于在循环中提供摘要/检查请求。

    使用它们可以非常简单:

    ...
    StandardStringDigester digester = new StandardStringDigester();
    digester.setAlgorithm("SHA-1");   // optionally set the algorithm
    digester.setIterations(50000);  // increase security by performing 50000 hashing iterations
    ...
    String digest = digester.digest(myMessage);
    ...
    

    这些标准的和池化的摘要器实现了一组连贯且安全的默认配置值,但它们可以通过两种方式进行额外配置:

    • 通过调用其 setX(…) 方法(算法、提供者、盐大小等)
    • 通过设置一个 DigesterConfig 对象来配置消化器。 提供了此接口的默认 bean 实现 (SimpleDigesterConfig),但用户可以创建他/她自己的实现,以便能够以他/她需要的任何方式检索配置参数。

    提高多处理器/多核系统的性能

    池化消化器具有与其非池化标准相关的完全相同的 API——因此它们可以互换使用——但添加了一个新的必需配置方法,称为 setPoolSize(),用于确定它们将在内部保留的标准消化器的数量。

    ...
    PooledStringDigester digester = new PooledStringDigester();
    digester.setPoolSize(4);          // This would be a good value for a 4-core system 
    digester.setAlgorithm("SHA-1");
    digester.setIterations(50000);
    ...
    String digest = digester.digest(myMessage);
    ...
    

    这些池化对象将使用其内部 Standard* 摘要器以循环方式为请求提供服务,因此由标准工件中的同步代码导致的线程阻塞量减少到最低限度。

    这些实现不会创建新线程,因此它们可以安全地用于不允许创建新线程的容器控制环境中。

    为特定应用程序和机器推荐的池大小取决于许多因素,但将大致等于机器中处理器/内核的数量。

    Encryptors

    加密器是专门用于执行双向加密操作的类。 也就是说,它们既可以加密纯数据,也可以解密加密数据。

    jasypt 中加密的相关接口位于 org.jasypt.encryption 包中,它们是:

    • ByteEncryptor 用于字节数组的加密和解密。
    • StringEncryptor 用于字符串的加密和解密。
    • BigIntegerEncryptor 用于对 BigInteger 进行加密和解密。
    • BigDecimalEncryptor 用于对 BigDecimals 进行加密和解密。
      Jasypt 提供了一种加密类型的实现:基于密码的加密 (PBE)。

    Password-Based Encryption (PBE)

    基于密码的加密是通过从用户提供的密码生成加密密钥,并将输入和生成的密钥提供给加密算法来执行的。 密钥通常是通过对密码应用一些散列函数来获得的。

    因此,jasypt 中的所有 PBE 加密器都需要在用于加密或解密操作之前设置密码。

    jasypt 中 PBE 的相关接口位于 org.jasypt.encryption.pbe 包中,它们是:

    • PBEByteEncryptor 用于字节数组的基于密码的加密和解密。
    • PBEStringEncryptor 用于基于密码的字符串加密和解密。
    • PBEBigIntegerEncryptor 用于 BigInteger 的基于密码的加密和解密。
    • PBEBigDecimalEncryptor 用于 BigDecimals 的基于密码的加密和解密。

    以及以下标准实现:

    • StandardPBEByteEncryptor:PBEByteEncryptor 的非常可配置且极其安全的实现,按照 PKCS #5:基于密码的加密标准中给出的指令实现。
    • StandardPBEStringEncryptor:StandardPBEByteEncryptor 的字符串对应物,接收字符串输入并返回字符集安全、BASE64(或十六进制)编码的字符串输出作为加密结果。
    • StandardPBEBigIntegerEncryptor:相当于StandardPBEByteEncryptor,接收BigInteger输入,返回BigInteger输出。
    • StandardPBEBigDecimalEncryptor:相当于StandardPBEByteEncryptor,接收BigDecimal 输入并返回BigDecimal 输出。

    及其相应的基于池的实现,可在多处理器/多核系统中实现高性能:

    • PooledPBEByteEncryptor:与 StandardPBEByteEncryptor 相同的 API,但实际上包含这些对象的池,用于在循环中为加密/解密请求提供服务。
    • PooledPBEStringEncryptor:与 StandardPBEStringEncryptor 相同的 API,但实际上包含这些对象的池,用于在循环中为加密/解密请求提供服务。
    • PooledPBEBigIntegerEncryptor:与 StandardPBEBigIntegerEncryptor 相同的 API,但实际上包含这些对象的池,用于在循环中提供加密/解密请求。
    • PooledPBEBigDecimalEncryptor:与 StandardPBEBigDecimalEncryptor 相同的 API,但实际上包含这些对象的池,用于在循环中为加密/解密请求提供服务。

    它的基本用法可以非常简单:

    ...
    StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
    encryptor.setPassword("jasypt");                         // we HAVE TO set a password
    encryptor.setAlgorithm("PBEWithHMACSHA512AndAES_256");   // optionally set the algorithm
    encryptor.setIvGenerator(new RandomIvGenerator());       // for PBE-AES-based algorithms, the IV generator is MANDATORY
    ...
    String encryptedText = encryptor.encrypt(myText);
    ...
    String plainText = encryptor.decrypt(encryptedText);  // myText.equals(plainText)
    ...
    

    与摘要器一样,标准*加密器实现了一组连贯且安全的默认配置值(密码除外),但它们也可以通过两种方式进行额外配置:

    通过调用其 setX(…) 方法(算法、提供者、密码、salt、IV 等…)
    通过设置配置消化器的 PBEConfig 对象。 提供了此接口的默认 bean 实现 (SimplePBEConfig),但用户可以创建他/她自己的实现,以便能够以他/她需要的任何方式检索配置参数(例如,从远程服务器检索密码)。

    提高多处理器/多核系统的性能

    池化加密器与非池化标准相关的 API 完全相同——因此它们可以互换使用——但添加了一个名为 setPoolSize() 的新必需配置方法,该方法建立了它们将在内部保留的标准加密器的数量。

    ...
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    encryptor.setPoolSize(4);          // This would be a good value for a 4-core system
    encryptor.setPassword("jasypt");
    encryptor.setAlgorithm("PBEWithMD5AndTripleDES");
    ...
    String encryptedText = encryptor.encrypt(myText);
    ...
    

    这些池化对象将使用其内部 Standard* 加密器以循环方式为请求提供服务,因此由标准工件中的同步代码导致的线程阻塞量减少到最低限度。

    这些实现不会创建新线程,因此它们可以安全地用于不允许创建新线程的容器控制环境中。

    为特定应用程序和机器推荐的池大小取决于许多因素,但将大致等于机器中处理器/内核的数量。

    使用精简版 Jasypt

    使用精简版 Jasypt

    从命令行加密:Jasypt CLI 工具

    Jasypt 提供了一系列命令行界面 (CLI) 工具,可用于从命令行执行加密、解密和摘要操作。

    为了使用这个工具,你应该下载分发 zip 文件(名为 jasypt-$VERSION-dist.zip)并解压它。 完成后,您将找到一个 jasypt-$VERSION/bin 目录,其中包含:

    1. 一组用于 Windows 执行的 .bat 文件:
      • encrypt.bat:用于 PBE(基于密码的加密)加密操作。
      • decrypt.bat:用于 PBE(基于密码的加密)解密操作。
      • digest.bat:用于消息摘要操作。
      • listAlgorithms.bat:用于列出 JVM 中可用的摘要和 PBE 加密算法。
    2. 一组用于 Linux/UNIX 执行的 .sh 文件:
      • encrypt.sh:用于 PBE(基于密码的加密)加密操作。
      • decrypt.sh:用于 PBE(基于密码的加密)解密操作。
      • digest.sh:用于消息摘要操作。
      • listAlgorithms.sh:用于列出 JVM 中可用的摘要和 PBE 加密算法。

    提 示 : \color{red}{提示:} 请注意,在使用 .sh 文件之前,您可能需要使用“chmod u+x *.sh”之类的内容为其添加执行权限。

    ::这些命令中的大多数都使用以下语法执行:
    
    ::[command] [argument1]=[value1] [argument2]=[value2] ...
    
    ::For example:
    
    ./digest.sh input="U3ERPA33_W0RD" algorithm=SHA1
    

    Extended Classpath:所有这些命令都遵循 JASYPT_CLASSPATH 环境变量的存在,其中包含用于执行加密/解密/摘要命令的扩展类路径定义。 如果用户想要配置他/她自己的安全提供程序或盐生成器实现,或者如果用户使用 Java 1.5 或更早版本并且需要将 icu4j 的 jars 添加到类路径(这些不再包含在 jasypt 的分发中),则此功能非常有用 )。

    Verbosity:这些命令中的大多数都接受一个详细参数(可以设置为 true(默认)或 false),它让用户从解释性输出切换到非常简化的输出,只显示操作的结果(对于脚本编写特别有用) )。

    Encryption from the command line (“encrypt” command)

    在命令行中使用 encrypt.bat/encrypt.sh 命令进行加密,其用法和参数化与 org.jasypt.encryption.pbe.StandardPBEStringEncryptor 的用法和参数化完全一致。 执行 CLI 命令时假定此加密器类的所有默认值。 要了解更多信息,请参阅 JavaDoc。

    Usage:

    $ ./encrypt.sh
    Using classpath: .:./lib/icu4j-3.4.4.jar:./lib/jasypt-1.9.x.jar
    
    USAGE: encrypt.sh [ARGUMENTS]
    
      * Arguments must apply to format:
    
          "arg1=value1 arg2=value2 arg3=value3 ..."
    
      * Required arguments:
    
          input
          password
    
      * Optional arguments:
    
          verbose
          algorithm
          keyObtentionIterations
          saltGeneratorClassName
          providerName
          providerClassName
          stringOutputType
          ivGeneratorClassName
    

    Examples:

    $ ./encrypt.sh input="This is my message to be encrypted" password=MYPAS_WORD
    
     ----ENVIRONMENT-----------------
    
    Runtime: Sun Microsystems Inc. Java HotSpot(TM) Client VM 1.6.0_03-b05
    
    
    
     ----ARGUMENTS-------------------
    
    input: This is my message to be encrypted
    password: MYPAS_WORD
    
    
    
     ----OUTPUT----------------------
    
    k1AwOd5XuW4VfPQtEXEdVlMnaNn19hivMbn1G4JQgq/jArjtKqryXksYX4Hl6A0e
    $ ./encrypt.sh input="This is my message to be encrypted" password=MYPAS_WORD verbose=false
    uv9+BnQFuZbfTV5Kf45oBOr0eJzBW5AS+XaYY+Lu5XWYhGgl0Ee41P0QUGpIrfyD
    

    Decryption from the command line (“decrypt” command)

    在命令行中使用decrypt.bat/decrypt.sh 命令进行解密,其用法和参数化与org.jasypt.encryption.pbe.StandardPBEStringEncryptor 的用法和参数化完全一致。 执行 CLI 命令时假定此加密器类的所有默认值。 要了解更多信息,请参阅 JavaDoc。

    Usage:

    $ ./decrypt.sh
    Using classpath: .:./lib/icu4j-3.4.4.jar:./lib/jasypt-1.9.x.jar
    
    USAGE: decrypt.sh [ARGUMENTS]
    
      * Arguments must apply to format:
    
          "arg1=value1 arg2=value2 arg3=value3 ..."
    
      * Required arguments:
    
          input
          password
    
      * Optional arguments:
    
          verbose
          algorithm
          keyObtentionIterations
          saltGeneratorClassName
          providerName
          providerClassName
          stringOutputType
          ivGeneratorClassName
    

    Examples:

    $ ./decrypt.sh input="k1AwOd5XuW4VfPQtEXEdVlMnaNn19hivMbn1G4JQgq/jArjtKqryXksYX4Hl6A0e" password=MYPAS_WORD
    
     ----ENVIRONMENT-----------------
    
    Runtime: Sun Microsystems Inc. Java HotSpot(TM) Client VM 1.6.0_03-b05
    
    
    
     ----ARGUMENTS-------------------
    
    input: k1AwOd5XuW4VfPQtEXEdVlMnaNn19hivMbn1G4JQgq/jArjtKqryXksYX4Hl6A0e
    password: MYPAS_WORD
    
    
    
     ----OUTPUT----------------------
    
    This is my message to be encrypted
    $ ./decrypt.sh input="k1AwOd5XuW4VfPQtEXEdVlMnaNn19hivMbn1G4JQgq/jArjtKqryXksYX4Hl6A0e" password=MYPAS_WORD verbose=false
    This is my message to be encrypted
    

    Digest from the command line (“digest” command)

    摘要在命令行中使用digest.bat/digest.sh 命令执行,其用法和参数化与org.jasypt.digest.StandardStringDigester 的用法和参数化完全对应。 执行 CLI 命令时假定此摘要器类的所有默认值。 要了解更多信息,请参阅 JavaDoc。

    Usage:

    $ ./digest.sh
    Using classpath: .:./lib/icu4j-3.4.4.jar:./lib/jasypt-1.9.x.jar
    
    USAGE: digest.sh [ARGUMENTS]
    
      * Arguments must apply to format:
    
          "arg1=value1 arg2=value2 arg3=value3 ..."
    
      * Required arguments:
    
          input
    
      * Optional arguments:
    
          verbose
          algorithm
          iterations
          saltSizeBytes
          saltGeneratorClassName
          providerName
          providerClassName
          invertPositionOfSaltInMessageBeforeDigesting
          invertPositionOfPlainSaltInEncryptionResults
          useLenientSaltSizeCheck
          unicodeNormalizationIgnored
          stringOutputType
          prefix
          suffix
    

    Examples:

    $ ./digest.sh input="userDaTaBaSe_pass_word"
    
     ----ENVIRONMENT-----------------
    
    Runtime: Sun Microsystems Inc. Java HotSpot(TM) Client VM 1.6.0_03-b05
    
    
    
     ----ARGUMENTS-------------------
    
    input: userDaTaBaSe_pass_word
    
    
    
     ----OUTPUT----------------------
    
    RSeN4JXTJwVFK6YYnxr6kYzK5I7aDqnJ
    $ ./digest.sh input="userDaTaBaSe_pass_word" verbose=false
    3oZF4OzyW/0OZEDG/EU+22b+0ZJg9FSc
    

    Listing algorithms

    listAlgorithms[.sh|.bat] 脚本将列出 Java VM 中可用的摘要和 PBE(基于密码的加密)算法。

    它不接收任何参数,其用法非常简单:

    $ ./listAlgorithms.sh
    
    DIGEST ALGORITHMS:   [MD2, MD5, SHA, SHA-256, SHA-384, SHA-512]
    
    PBE ALGORITHMS:      [PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_40]
    

    提 示 : \color{red}{提示:} 请注意,此命令不会列出来自非默认 JCE 提供程序(如 Bouncy Castle)的任何参数,除非您已通过将提供程序的 jar 文件复制到我们的 JRE 安装的扩展目录 ($JRE_HOME/lib/ext) 在 JVM 安装中注册了此类提供程序 ),然后在 $JRE_HOME/lib/security 中的 java.security 文件中的提供程序列表末尾附加 Provider 类的名称。 有关更多详细信息,请参阅使用非默认提供程序或 Jasypt + Bouncy Castle。

    高级用法

    加密器和摘要器的高级配置

    加密器和摘要器的高级配置

    Web PBE Configuration

    在 Web 应用程序中,Jasypt 允许开发人员避免将 PBE 加密器的加密密码存储在 Web 应用程序内的文件中,而是在每次部署时通过 Web 界面向应用程序指定这些密码。

    这是通过以下基础设施实现的:

    • 特殊的 *Config 类:org.jasypt.encryption.pbe.WebPBEConfig 和 org.jasypt.encryption.pbe.WebStringPBEConfig,当分配给加密器时,“标记”该加密器有资格通过网络接收其密码。
    • 一个上下文侦听器 org.jasypt.web.pbeconfig.WebPBEInitializationContextListener 它将让我们创建我们的加密器,设置它们的 WebPBEConfig 配置并将它们注册到我们应用程序的某个地方。 如果我们使用 Spring Framework,则不需要此上下文侦听器。
    • 过滤器 org.jasypt.web.pbeconfig.WebPBEConfigFilter,它将避免任何用户访问 Web 应用程序,直到管理员设置了加密密码。
    • 一个 servlet,org.jasypt.web.pbeconfig.WebPBEConfigServlet,它将向授权用户显示一个表单,他/她可以使用该表单为所有带有 WebPBEConfig 的加密器设置加密密码。

    WebPBEConfig

    对于要从网络分配密码的加密器,只需为其分配一个 WebPBEConfig 对象,该对象必须使用唯一名称和验证字进行初始化。 该名称将标识配置对象(以及加密器),验证字将确保只有授权人员(例如,应用程序部署者)才能设置密码。

    WebPBEInitializationContextListener

    这是一个 ContextListener,它将 org.jasypt.web.pbeconfig.WebPBEInitializer 实现类名称作为参数 (context-param) 并调用其 initializeWebPBEConfigs() 方法以允许 web 应用程序创建其 PBE 加密器并声明其关联的 WebPBEConfig 对象。

    一个示例 WebPBEInitializer 实现:

    package myapp;
      ... 
      public class MyWebPBEInitializer implements WebPBEInitializer {
      
        public void initializeWebPBEConfigs() {
        
          StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
          encryptor.setAlgorithm("PBEWithMD5AndDES");
          
          WebPBEConfig webConfig = new WebPBEConfig();
          webConfig.setValidationWord("jasypt");
          webConfig.setName("Main Password");
    
          encryptor.setConfig(webConfig);
          
          // Get some user-defined singleton or similar, and register
          // the encryptor with it so that it can be accessed from the
          // rest of the application.
            
        }
          
    }
    

    一个示例 web.xml 片段,注册上下文侦听器:

    <context-param>
      <param-name>webPBEInitializerClassName</param-name>
      <param-value>myapp.MyWebPBEInitializer</param-value>
    </context-param>
    
    <listener>
      <listener-class>
        org.jasypt.web.pbeconfig.WebPBEInitializationContextListener
      </listener-class>
    </listener>
    

    提 示 : \color{red}{提示:} 重要提示:如果 web 应用程序使用 Spring 框架,WebPBEConfig 对象在 Spring 上下文中被声明为 bean,并且这个 Spring 上下文在应用程序部署时初始化(使用 Spring 的 ContextLoaderListener),则不需要使用这个上下文侦听器。

    WebPBEConfigFilter

    此过滤器旨在避免在管理员设置加密密码之前访问 Web 应用程序。 它将查询网络 PBE 配置系统以了解是否已设置密码,如果没有,它将向用户显示一个简单的访问禁止页面。

    示例 web.xml 片段(应用于 Struts servlet):

    <filter>
      <filter-name>webPBEConfigFilter</filter-name>
      <filter-class>org.jasypt.web.pbeconfig.WebPBEConfigFilter</filter-class>
    </filter>
    
    <filter-mapping>
      <filter-name>webPBEConfigFilter</filter-name>
      <servlet-name>strutsActionServlet</servlet-name>
    </filter-mapping>    
    

    WebPBEConfigServlet

    这个 servlet 的 URL 应该在部署时由 webapp 管理员调用,用于设置所有先前分配了 WebPBEConfig 配置对象的 PBE 加密器的密码。

    如果尚未完成 Web PBE 配置,它将向用户显示一个表单,其中包含每个加密器的两个输入:验证字和密码(重新输入)。

    验证词必须通过其 setValidationWord(…) 方法输入到 WebPBEConfig 对象上设置的值中。 这将确保只有授权人员才能设置加密密码。
    密码(重新键入)必须输入到希望作为每个特定加密器的加密密码的值中。

    一个示例 web.xml 片段:

    <servlet>
      <servlet-name>webPBEConfigServlet</servlet-name>
      <servlet-class>
        org.jasypt.web.pbeconfig.WebPBEConfigServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>webPBEConfigServlet</servlet-name>
      <url-pattern>/webPBEConfig.do</url-pattern>
    </servlet-mapping>
    

    如果此 servlet 的上下文设置为记录器,它将为成功和失败的密码设置尝试输出消息,包括日期、时间和原始 IP 地址。

    将 Jasypt 与非默认 JCE 提供程序一起使用

    将 Jasypt 与非默认 JCE 提供程序一起使用

    按日期类型

    Encrypting passwords

    Encrypting passwords

    Encrypting texts

    Encrypting texts

    Encrypting numbers

    Encrypting numbers

    Encrypting binaries

    Encrypting binaries

    Encrypting application configuration files

    Jasypt 以三种不同的方式提供对加密应用程序配置的支持:

    • .properties files: Jasypt 提供了 org.jasypt.properties.EncryptableProperties 类,用于加载、管理和透明解密 .properties 文件中的加密值,允许在同一文件中混合加密和未加密的值。
    • Spring集成的.properties文件透明解密:Jasypt可以集成到Spring Framework(2.x和3.x)的配置系统中,透明地解密Spring应用使用的.properties文件。 了解更多:Spring 2.x、Spring 3.0、Spring 3.1、Spring 4.0。
    • Hibernate 的 hibernate.cfg.xml 文件中数据源参数的加密:Jasypt 为 Hibernate 提供了两个连接提供程序类(基于 DriverManager 和 C3P0),它们允许基本数据源参数(驱动程序、url、用户名和密码)以加密的形式写入 hibernate.cfg.xml 文件中的方式。 了解更多。

    通过这种方式,jasypt 支持在多个场景(基于 Hibernate、Spring、两者或两者都不是的应用程序)中对敏感配置数据进行加密。

    作为一般规则,jasypt 期望加密的配置参数出现在“ENC(…)”周围。 您可以使用 CLI 工具计算此值。

    在这里你可能会想:“等等…我可以加密我的配置文件中的值,好吧,但是…我仍然需要一个密码(加密密码)来解密它们!我在哪里可以安全地存储它?”。 没错,您仍然需要一个密码,但这次是加密密码,在 jasypt 控制下,因此可以通过许多其他更安全的方式进行配置(特别推荐环境变量或 Web PBE 配置…)。

    EncryptableProperties

    通过使用 org.jasypt.properties.EncryptableProperties 对象,应用程序将能够正确读取和使用 .properties 文件,如下所示:

    datasource.driver=com.mysql.jdbc.Driver
    datasource.url=jdbc:mysql://localhost/reportsdb
    datasource.username=reportsUser
    datasource.password=ENC(G6N718UuyPE5bHyWKyuLQSm02auQPUtm)
    

    请注意,数据库密码已加密(实际上,任何其他属性也可以加密,无论是否与数据库配置相关)。

    我们如何读取这个值? 像这样:

    /*
      * First, create (or ask some other component for) the adequate encryptor for
      * decrypting the values in our .properties file.
      */
     StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
     encryptor.setPassword("jasypt"); // could be got from web, env variable...
     encryptor.setAlgorithm("PBEWithHMACSHA512AndAES_256");
     encryptor.setIvGenerator(new RandomIvGenerator());
     
     /*
      * Create our EncryptableProperties object and load it the usual way.
      */
     Properties props = new EncryptableProperties(encryptor);
     props.load(new FileInputStream("/path/to/my/configuration.properties"));
    
     /*
      * To get a non-encrypted value, we just get it with getProperty...
      */
     String datasourceUsername = props.getProperty("datasource.username");
    
     /*
      * ...and to get an encrypted value, we do exactly the same. Decryption will
      * be transparently performed behind the scenes.
      */ 
     String datasourcePassword = props.getProperty("datasource.password");
    
     // From now on, datasourcePassword equals "reports_passwd"...
    

    为了解密加密值,我们只需要使用 getProperty 访问它,就像任何其他非加密值一样。

    EncryptableProperties 对象可以接收 org.jasypt.encryption.StringEncryptor 实现或 org.jasypt.util.TextEncryptor 对象作为构造函数参数。

    Building

    Jasypt + Apache Maven

    文章

    如何加密用户密码

    参考文献

    Jasypt 官方文档
    JCE
    Jasypt JavaDoc API
    Jasypt 经常被问到的问题
    Jasypt Spring Boot 参考手册

    展开全文
  • jasypt-spring-boot-samples 使用jasypt-spring-boot的示例应用程序
  • jasypt-spring-boot-starter 即jasypt-1.9.3.jar 需求 在项目中,经常需要在配置文件里配置一些敏感信息,比如数据库用户名和密码,redis、mq的连接信息等。如果直接写明文,很容易造成密码泄露等安全问题。 ...

    目录

    项目背景

    需求

    jasypt简介

    使用

    1,引入依赖

     2,启用加密

    2.1,在启动类上配置注解

    2.2,启用注解扫描和@Configuration配置

    2.3,只针对指定的配置文件生效

    3,配置加密属性

    4,使用-在配置文件里将明文改成密文

    4.1,根据上面配置的算法,将所需要的明文转换为对应的密文

    4.2,将密文配置到配置文件里

    其它

    常见错误

    算法

    附录


    项目背景

            Spring Boot 2.0.8

            jasypt-spring-boot-starter 即jasypt-1.9.3.jar

     

    需求

            在项目中,经常需要在配置文件里配置一些敏感信息,比如数据库用户名和密码,redis、mq的连接信息等。如果直接写明文,很容易造成密码泄露等安全问题。

    jasypt简介

    Jasypt 是一个 Java 库,它允许开发者以最小的努力为他/她的项目添加基本的加密功能,而且不需要对密码学的工作原理有深刻的了解。

    • 高安全性、基于标准的加密技术,既可用于单向加密也可用于双向加密。加密密码、文本、数字、二进制文件...
    • 与Hibernate的透明集成。
    • 适合集成到基于Spring的应用程序中,也可与Spring Security透明地集成。
    • 对应用程序的配置(即数据源)进行加密的综合能力。
    • 在多处理器/多核系统中具有高性能加密的特殊功能。
    • 开放的API,可与任何JCE供应商一起使用。
    • 配置相关加密信息,就能够实现在项目运行的时候,自动把配置文件中已经加密的信息解密成明文,供程序使用

    可以加密所有的Spring环境配置信息,比如系统变量、环境变量、命令行变量、application.properties、yaml配置等

     (This means any system property, environment property, command line argument, application.properties, application-*.properties, yaml properties, and any other property sources can contain encrypted properties)

    使用

    1,引入依赖

    maven方式:

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

     2,启用加密

    几种方式:

    2.1,在启动类上配置注解

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

    2.2,启用注解扫描和@Configuration配置

    启动类:

    @SpringBootApplication
    @EnableAutoConfiguration
    public class MyApplication {
        ...
    }
    

    配置类:

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

    2.3,只针对指定的配置文件生效

    配置类:支持单个或多个配置文件:

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

    3,配置加密属性

    方式一:在application配置文件里配置jasypt的属性:

    StringEncryptor

    KeyRequiredDefault Value
    jasypt.encryptor.passwordTrue-
    jasypt.encryptor.algorithmFalsePBEWITHHMACSHA512ANDAES_256
    jasypt.encryptor.key-obtention-iterationsFalse1000
    jasypt.encryptor.pool-sizeFalse1
    jasypt.encryptor.provider-nameFalseSunJCE
    jasypt.encryptor.provider-class-nameFalsenull
    jasypt.encryptor.salt-generator-classnameFalseorg.jasypt.salt.RandomSaltGenerator
    jasypt.encryptor.iv-generator-classnameFalseorg.jasypt.iv.RandomIvGenerator
    jasypt.encryptor.string-output-typeFalsebase64
    jasypt.encryptor.proxy-property-sourcesFalsefalse
    jasypt.encryptor.skip-property-sourcesFalseempty list

    默认的加密算法是PBEWithHMACSHA512AndAES_256,对应的加解码器是AES256TextEncryptor

    配置例子:application.yml

    jasypt:
      encryptor:
        password: myJasyptPassword

    项目实例里,一般来说password不在配置文件里写成明文的方式,而是配置成环境变量,启动应用的时候传递进去。

    jasypt:
        encryptor:
            password: ${JASYPT_ENCRYPTOR_PASSWORD:}

    设置环境变量:

    # 打开/etc/profile文件 vim /etc/profile # 文件末尾插入

    export JASYPT_PASSWORD = myJasyptPassword

    启动:

    JASYPT_ENCRYPTOR_PASSWORD=${JASYPT_PASSWORD} java -jar my-applicaiton-SNAPSHOT.jar
    

    或者配置属性,直接在启动的时候设置:

    	java -jar my-applicaiton-SNAPSHOT.jar --jasypt.encryptor.password=myJasyptPassword
    

    方式二:自定义对象

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

    特别注意:算法和IV生成器要匹配,比如上面的PBEWITHHMACSHA512ANDAES_256和org.jasypt.iv.RandomIvGenerator

    4,使用-在配置文件里将明文改成密文

    4.1,根据上面配置的算法,将所需要的明文转换为对应的密文

    方式有很多,可以写工具类,或者提供一个controller服务生成,或者用mvn插件,或者用批处理生成

    下面的测试类就提供了3种方式:

    
    import org.jasypt.encryption.StringEncryptor;
    import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
    import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
    import org.jasypt.util.text.AES256TextEncryptor;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.annotation.Resource;
    
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class JasyptTests {
    
        @Resource(name = "jasyptStringEncryptor")
        StringEncryptor encryptor;
    
        /**
         * 直接使用项目里的加密器,可以保证加密和解密用的加密器是同一个,生成的密文不会有问题
         * 测试jasypt加密、解密,生成密文
         */
        @Test
        public void testJasypt() {
            String myEncryptedText = encryptor.encrypt("root");
            System.out.println("加密后:"+myEncryptedText);
            String plainText = encryptor.decrypt(myEncryptedText);
            System.out.println("解密后:"+plainText);
        }
    
        public static void main(String[] args) {
            // 直接使用加密算法对应的加密器类
            AES256TextEncryptor textEncryptor = new AES256TextEncryptor();
            textEncryptor.setPassword("myJasyptPassword");
            String myEncryptedText = textEncryptor.encrypt("root");
            System.out.println("加密后:"+myEncryptedText);
            String plainText = textEncryptor.decrypt(myEncryptedText);
            System.out.println("解密后:"+plainText);
    
            // 根据配置的加密器配置类生成加密器对象
            PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
            SimpleStringPBEConfig config = new SimpleStringPBEConfig();
            config.setPassword("myJasyptPassword");
            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);
    
            String myEncryptedText1 = encryptor.encrypt("root");
            System.out.println("加密后:"+myEncryptedText1);
            String plainText1 = encryptor.decrypt(myEncryptedText1);
            System.out.println("解密后:"+plainText1);
        }
    }
    

    命令行方式:

    放到jasypt-1.9.3.jar包的路径下myJasyptEncrypt.bat

    @echo off
     set input=root
     set password=myJasyptPassword
     set algorithm=PBEWithHMACSHA512AndAES_256
     set ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator
     echo 加密中......
     java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=%input% password=%password% algorithm=%algorithm% ivGeneratorClassName=%ivGeneratorClassName%
     pause
    

    4.2,将密文配置到配置文件里

    默认的前后缀是ENC(),括号里是密文,如:

    spring:
      datasource:
        driverClassName: com.mysql.cj.jdbc.Driver
        username: ENC(l8KWjRLCqT/x/PLjgKYzhgMTI2uOeTsicN8WExG/gAfak+bDCDPnDN3foKQrTlqO)
        password: ENC(vig6aKnn+B5IOAD/AHr5McuvNyFCggfibS8EyvrJpZK1llOyFvHAEMwXkVdX6BsB)

    注:前后缀是可以修改的,比如修改成ENC@[]

    在jasypt配置属性的地方设置,比如application.yml

    jasypt:
      encryptor:
        property:
          prefix: "ENC@["
          suffix: "]"

    其它

    常见错误

    项目启动失败,日志信息:

    org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'spring.datasource.password' to java.lang.String

    错误信息是无法将spring.datasource.password转换成String类型,在我们的配置文件里,spring.datasource.password是用jasypt加密的,那么导致错误的:解密spring.datasource.password的值失败

    spring:
      datasource:
        password: ENC(1A1K90zmmz12mxbEFLLuzOvbJ4SBqWZX5RPLwv1bxqrXAdpEo23hhZc+7zUc6cFf)

    导致解密失败的原因有很多,基本都是加密和解密用的配置信息不一样,比如加密password、加密算法、iv-generator-classname等:

    1.加密时使用的加密password的值和程序运行时使用的加密password值不一样

    2.加密时使用的算法algorithm的值和程序运行时使用的算法algorithm不一样

    3.spring.datasource.password配置的值格式有问题,比如拼写错误、更改了加密语法的前后缀,值却还是ENC(...),应该改成ENC@[...]

    jasypt:
      encryptor:
        property:
          prefix: "ENC@["
          suffix: "]"
    
    

    算法

    下载jasypt-1.9.3-dist.zip,在命令行执行listAlgorithms.bat脚本

    下载地址:github中的README.md里的Download distributable

    jasypt/jasypt: Jasypt (Java Simplified Encryption) is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and without the need of having deep knowledge on how cryptography works. (github.com)https://github.com/jasypt/jasypt

    DIGEST ALGORITHMS:   [MD2, MD5, SHA, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256]

    PBE ALGORITHMS:      [PBEWITHHMACSHA1ANDAES_128, PBEWITHHMACSHA1ANDAES_256, PBEWITHHMACSHA224ANDAES_128, PBEWITHHMACSHA224ANDAES_256, PBEWITHHMACSHA256ANDAES_128, PBEWITHHMACSHA256ANDAES_256, PBEWITHHMACSHA384ANDAES_128, PBEWITHHMACSHA384ANDAES_256, PBEWITHHMACSHA512ANDAES_128, PBEWITHHMACSHA512ANDAES_256, PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_128, PBEWITHSHA1ANDRC2_40, PBEWITHSHA1ANDRC4_128, PBEWITHSHA1ANDRC4_40]

    附录

     官网:

    ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot (github.com)Jasypt: Java simplified encryption - Jasypt: Java simplified encryption - Encrypting textsulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot (github.com)

    例子 ulisesbocchio/jasypt-spring-boot-samples: Sample apps using jasypt-spring-boot (github.com)

            

    展开全文
  • jasypt加密

    千次阅读 2019-04-24 18:28:02
    在jar包所在目录打开命令行,运行如下加密命令: java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=security algorithm=PBEWithMD5AndDES 运行结果如下: ----...
  • 解析jasypt加密算法

    千次阅读 2021-05-14 08:53:16
    解析jasypt加密算法 算法的使用 可以参考:https://izpan.com/springboot-jasypt.html 原理 demo1 package com.junna.jasypt; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt....
  • 在Spring Boot项目中对Jasypt进行集成,当生成密码之后,启动程序抛如下异常: com.ulisesbocchio.jasyptspringboot.exception.DecryptionException: Unable to decrypt。 完整异常信息如下: Caused by: ...
  • 1、前言 如果我们把大量的配置信息都...这个时候,jasypt框架就派上用场了。 2、使用 1. 引入pom包 <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-
  • springboot 2.x工程,将jasypt升级到3.x-->3.0.3后,配置一个属性为加密,工程启动后报错如下 #### # # ##### ###### # # # # # # # # # # ##### ##### # # # # # # # # # # # # # #### #### ##

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,881
精华内容 1,152
关键字:

jasypt