Jasypt

Jasypt是加密库,支持密码、Digest认证、文本、对象加密。

密码加密复合RFC2307标准。 http://www.jasypt.org/download.html

spring项目参考: https://blog.csdn.net/gdfsbingfeng/article/details/16886805

仓库地址: https://github.com/ulisesbocchio/jasypt-spring-boot

使用过程也可查看仓库README.md: https://github.com/ulisesbocchio/jasypt-spring-boot

maven官网地址: https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter

springboot使用jasypt

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

需要注意版本对应

jasypt-spring-boot-starter 依赖的 spring-boot-starter
2.1.0 2.0.3.RELEASE 2.2.6.RELEASE
2.0.0 2.0.0.RELEASE 2.2.6.RELEASE
1.18 1.5.10.RELEASE 2.2.6.RELEASE
1.12 1.5.1.RELEASE 2.2.6.RELEASE

需要注意加解密的类型一致,如:

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

简单使用例子

1、添加测试程序
<!-- 方式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>
  • 添加springboot接口
@RestController
public class TestController {
    @Value("${test.password:testpassword}")
    private String jasyptTestPassword;
    @RequestMapping(value = "/testJasypt", method = RequestMethod.GET)
    public Object testJasyptPassword(){
        return "get password:" + jasyptTestPassword;
  • 配置文件添加加密后的配置
test:
  password: ENC(获取到的密文)
# 如果密文加盐,需要配置盐值
jasypt:
  encryptor:
    password: 盐值
2、获取密文

2-1、通过java程序获取密文

// -----默认加解密
@Autowired
StringEncryptor stringEncryptor;
@Test
public void encryptPwd() {
    String passwordEn = stringEncryptor.encrypt("root");
    String passwordDe = stringEncryptor.decrypt(passwordEn);
    System.out.println("password密文:" + passwordEn);
    System.out.println("password明文:" + passwordDe);
// -----加盐加解密
@Test
public void test() {
    StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
    encryptor.setPassword("hello"); //设置加密盐值
    String passwordEn = encryptor.encrypt("root");
    String passwordDe = encryptor.decrypt(passwordEn);
    System.out.println("password密文:" + passwordEn);
    System.out.println("password明文:" + passwordDe);
// -----加解密工具类
public class JasypUtil {
    private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";
    private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";
     * @Description: Jasyp加密(PBEWithMD5AndDES)
     * @Author:      Rambo
     * @CreateDate:  2020/7/13 10:24
     * @UpdateUser:  Rambo
     * @UpdateDate:  2020/7/13 10:24
     * @param		 plainText      待加密的原文
     * @param		 factor         加密秘钥
     * @return       java.lang.String
     * @Version:     1.0.0
    public static String encryptWithMD5(String plainText, String factor) {
        // 1. 创建加解密工具实例
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        // 2. 加解密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm(PBEWITHMD5ANDDES);
        config.setPassword(factor);
        encryptor.setConfig(config);
        // 3. 加密
        return encryptor.encrypt(plainText);
     * @Description: Jaspy解密(PBEWithMD5AndDES)
     * @Author:      Rambo
     * @CreateDate:  2020/7/13 10:28
     * @UpdateUser:  Rambo
     * @UpdateDate:  2020/7/13 10:28
     * @param		 encryptedText      待解密密文
     * @param		 factor             解密秘钥
     * @return       java.lang.String
     * @Version:     1.0.0
    public static String decryptWithMD5(String encryptedText, String factor) {
        // 1. 创建加解密工具实例
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        // 2. 加解密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm(PBEWITHMD5ANDDES);
        config.setPassword(factor);
        encryptor.setConfig(config);
        // 3. 解密
        return encryptor.decrypt(encryptedText);
     * @Description: Jasyp 加密(PBEWITHHMACSHA512ANDAES_256)
     * @Author:      Rambo
     * @CreateDate:  2020/7/25 14:34
     * @UpdateUser:  Rambo
     * @UpdateDate:  2020/7/25 14:34
     * @param		 plainText  待加密的原文
     * @param		 factor     加密秘钥
     * @return       java.lang.String
     * @Version:     1.0.0
    public static String encryptWithSHA512(String plainText, String factor) {
        // 1. 创建加解密工具实例
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        // 2. 加解密配置
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(factor);
        config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
        // 为减少配置文件的书写,以下都是 Jasyp 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(plainText);
     * @Description: Jaspy解密(PBEWITHHMACSHA512ANDAES_256)
     * @Author:      Rambo
     * @CreateDate:  2020/7/25 14:40
     * @UpdateUser:  Rambo
     * @UpdateDate:  2020/7/25 14:40
     * @param		 encryptedText  待解密密文
     * @param		 factor         解密秘钥
     * @return       java.lang.String
     * @Version:     1.0.0
    public static String decryptWithSHA512(String encryptedText, String factor) {
        // 1. 创建加解密工具实例
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        // 2. 加解密配置
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(factor);
        config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
        // 为减少配置文件的书写,以下都是 Jasyp 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(encryptedText);

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

  • 添加依赖,下载好jar包到本地maven仓库后,cmd进入jasypt.jar包所在的目录
如个人本地目录:D:\Environmental\RepMaven\org\jasypt\jasypt\1.9.3
  • 加密命令,参数说明:
    • 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----------------------
aCEx6r9g2lBuGF8w/XU8wQ==
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: aCEx6r9g2lBuGF8w/XU8wQ==
password: hello
----OUTPUT----------------------
3、使用密文:ENC(密文)
  • 如数据源密码加密
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mytest?characterEncoding=UTF-8&&serverTimezone=GMT
    username: root
    password: ENC(AxfLzLN0ayIYc7dGypds0g==)  # 明文=root
  • 测试程序中密码配置加密
test:
  password: ENC(aCEx6r9g2lBuGF8w/XU8wQ==) # 未加盐:bnwAMepYNbDeCkENg+cerQ==   明文=root
# 如果密文加盐,需要配置盐值
jasypt:
  encryptor:
    password: hello
4、访问测试接口
#访问接口
http://localhost:8080/testJasypt
get password: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替换Java\jdk1.8.0_77\jre\lib\security\路径下的jar包
yml中带有@引起的问题
yml中@是特殊字符, 含有@左右需要加单引号。
jasypt 自动加密整个文件的时候,会将单引号也当做密码的一部分,这样得到的密文肯定是错的。
#解决方案:
直接将密码生成,然后再复制过去,不要带双引号。

关于盐值配置设置

关于盐值配置方式。注意:关于盐值明文存放到配置文件,一样存在安全风险。

1、配置文件/配置中心设置
jasypt:
  encryptor:
    password: hello
2、系统环境变量设置
  • 在系统的环境变量中进行配置。
  • 配置文件中获取
jasypt:
  encryptor:
    password: ${ENCRYPT:hello}  # 系统环境找不到,默认使用hello
3、启动参数设置
  • 在启动配置中添加参数

在idea启动设置,本地可以正常启动,但是打包到服务器部署需要在idea中Mave打包和部署添加相关参数:

  • 添加maven打包参数
clean package -Djasypt.encryptor.password=hello
  • 启动时添加参数
java -jar -Djasypt.encryptor.password=123456 springboot-jasypt-test.jar
4、服务器配置文件设置

配置到服务器某文件中,启动时加载文件获取。

  • 不自定义加密类的话,默认算法为 PBEWithMD5AndDES

  • 多次生成,每次生成的密码不一样。不同的密码序列,解密却可以一样。

  • ENC前缀可改变,即自定义格式:需要添加配置

jasypt:
  encryptor:
    property:
      prefix: "TEST["
      suffix: "]"
                    参考:https://blog.csdn.net/enthan809882/article/details/105529349https://amore.blog.csdn.net/article/details/111468221https://blog.csdn.net/weixin_49076592/article/details/119797675JasyptJasypt是加密库,支持密码、Digest认证、文本、对象加密。密码加密复合RFC2307标准。http://www.ja
				
当我尝试在ubuntu20.04上运行GAMIT下的doy命令时,显示: root@DESKTOP-LF0EAC9:/etc/apt# doy doy: error while loading shared libraries: libgfortran.so.3: cannot open shared object file: No such file or directory 其中libgfortran.so.3依赖于gfortran-6,则尝试安装gfortran-6: root@DESKTOP:/e
error while loading shared libraries: libgfortran.so.3: can‘t open shared object file: No such file
这是缺少libgfortran.so.3库 在进行编译的时候,可能经常会遇到缺少某个依赖文件的error提示,但是如果知道缺少的文件来自于某个软件包,那么直接下载该软件包并安装即可解决问题。这里推荐先用apt-file寻找缺失文件所在的软件包 如果ubuntu系统没有安装apt-file,先安装 sudo apt-get install apt-file 更新apt-file数据库 sudo apt-file update 查找缺失文件所在软件包 sudo apt-file search
error while loading shared libraries: libXXX.so: cannot open shared object file: No such file or directory 这说明运行程序的时候,找不到libXXX.so这个动态库。 为什么找不到 通常原因是程序在登陆节点编译,在计算节...
ImportError: libgfortran.so.4: cannot open shared object file: No such file or directory >>> import mglearn Traceback (most recent call last): File "<stdin>", line 1, in <module&gt...
最近考虑学习GAMIT,下面给出安装记录。首先检查ubuntu系统的系统版本,使用如下命令获取系统编号uname -a笔者的系统为Ubuntu 16.04,该版本编号4401获取root权限,在root权限下执行sudo -s安装依懒apt-get install gcc apt-get install gfortran apt-get install csh apt-get install tc...
安装Ubuntu 22.04 LTS虚拟机可以按照以下步骤进行: 1. 首先,你需要下载Ubuntu 22.04 LTS安装镜像文件(ISO文件)。你可以在Ubuntu官方网站上找到并下载该镜像文件。 2. 接下来,你需要安装虚拟机软件。常见的虚拟机软件有VirtualBox和VMware。你可以选择其中一种进行安装。 3. 安装完虚拟机软件后,打开虚拟机软件并点击创建新虚拟机。 4. 在创建虚拟机的过程中,选择使用先前下载的Ubuntu 22.04 LTS的ISO文件作为虚拟机的操作系统安装媒体。 5. 设置虚拟机的硬件配置,如虚拟机的内存大小、硬盘大小等。 6. 完成虚拟机的创建后,启动虚拟机并按照安装向导的提示进行Ubuntu 22.04 LTS安装过程。 7. 在安装过程中,选择适当的语言、时区和键盘布局等设置。 8. 在安装类型中,选择“安装Ubuntu并清空整个磁盘”或者“安装Ubuntu并与其他操作系统共存”,根据你的需求进行选择。 9. 设置用户名和密码等必要信息。 10. 完成安装后,重启虚拟机并进入Ubuntu 22.04 LTS。 现在你可以开始使用Ubuntu 22.04 LTS虚拟机了!如果你有任何其他问题,我会乐意帮助你。