开发者

springboot jasypt2.x与jasypt3.x的使用方式

开发者 https://www.devze.com 2024-10-05 10:51 出处:网络 作者: 头未秃
目录1、前言2.x 版本的分析3.x 版本分析2、使用1. 引入pom包2. 创建加密工具类生成密码3. 修改配置文件,把配置文件中要加密的字段改为:ENC(密文)5、将加密密钥作为启动运行参数总结1、前言
目录
  • 1、前言
    • 2.x 版本的分析
    • 3.x 版本分析
  • 2、使用
    • 1. 引入pom包
    • 2. 创建加密工具类生成密码
    • 3. 修改配置文件,把配置文件中要加密的字段改为:ENC(密文)
    • 5、将加密密钥作为启动运行参数
  • 总结

    1、前言

    如果我们把大量的配置信息都放在配置文件中是会有安全隐患的,那么如何消除这个隐患呢?

    最直接的方式就是把配置信息中的一些敏感信息(比如数据库密码、中间件密码)加密,然后程序在获取这些配置的时候解密,就可以达到目的。

    这个时候,jasypt框架就派上用场了。

    2.x 版本的分析

    如果引入的是 2.x 的版本,启动信息如下:

    String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor

    Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWithMD5AndDES

    Encryptor config not found for property jasypt.encryptor.key-obtention-iterations, using default value: 1000

    Encryptor config not found for property jasypt.encryptor.pool-size, using default value: 1

    Encryptor config not found for property jasypt.encryptor.provider-name, using default value: null

    Encryptor config not found for property jasypt.encryptor.provider-class-name, using default value: null

    Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator

    Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.NoIvGenerator

    Encryptoandroidr config not found for property jasypt.encryptor.string-output-type, using default value: base64

    通过以上信息的解读,我们可以了解到的信息如下:

    默认加密算法:PBEWithMD5AndDES

    默认的迭代次数: 1000

    默认池大小: 1

    默认生成盐的类:org.jasypt.salt.RandomSaltGenerator

    默认IV生成器类:org.jasypt.iv.NoIvGenerator

    默认输出类型:base64

    3.x 版本分析

    如果引入的是 3.x 的版本,启动信息如下:

    String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor

    Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWITHHMACSHA512ANDAES_256

    Encryptor config not found for property jasypt.encryptor.key-obtention-iterations, using default value: 1000

    Encryptor config not found for property jasypt.encryptor.pool-size, using default value: 1

    Encryptor config not found for property jasypt.encryptor.provider-name, using default value: null

    Encryptor config not found for property jasypt.encryptor.provider-class-name, using dephpfault value: null

    Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator

    Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.RandomIvGenerator

    Encryptor config not found for property jasypt.encryptor.string-output-type, using default value: base64

    通过以上信息的解读,我们可以了解到的信息如下:

    默认加密算法:PBEWITHHMACSHA512ANDAES_256

    默认的迭代次数: 1000

    默认池大小: 1

    默认生成盐的类:org.jasypt.salt.RandomSaltGenerator

    默认IV生成器类:org.jasypt.iv.RandomIvGenerator

    默认输出类型:base64

    2、使用

    1. 引入pom包

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

    2. 创建加密工具类生成密码

    import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
    import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
    import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
    import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
    
    /**
     * Jasyp加解密工具类
     * @author chenxc
     * @date 2020/4/14 14:28
     */
    public class JasypUtil {
    
        private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";
    
        private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";
    
        /**
         * Jasyp2.x 加密(PBEWithMD5AndDES)
         * @param	php	 plainText      待加密的原文
         * @param		 factor         加密秘钥
         * @return       Java.lang.String
         */
        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);
        }
    
        /**
         * JASPy2.x 解密(PBEWithMD5AndDES)
         * @param		 encryptedText      待解密密文
         * @param		 factor             解密秘钥
         * @return       java.lang.String
         */
        public static String decryptWithMD5(String encryptedText, String factor) {
            // 1. 创建加解密工具实例
            Sthttp://www.devze.comandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
            // 2. 加解密配置
            EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
            config.setAlgorithm(PBEWITHMD5ANDDES);
            config.setPassword(factor);
            encryptor.setConfig(config);
            // 3. 解密
            return encryptor.decrypt(encryptedText);
        }
    
        /**
         * Jasyp3.x 加密(PBEWITHHMACSHA512ANDAES_256)
         * @param		 plainText  待加密的原文
         * @param		 factor     加密秘钥
         * @return       java.lang.String
         */
        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);
        }
    
        /**
         * Jaspy3.x 解密(PBEWITHHMACSHA512ANDAES_256)
         * @param		 encryptedText  待解密密文
         * @param		 factor         解密秘钥
         * @return       java.lang.String
         */
        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);
        }
    
        public static void main(String[] args) {
            String factor = "salt";
            String plainText = "123456";
            String encryptWithMD5Str = encryptWithMD5(plainText, factor);
            String decryptWithMD5Str = decryptWithMD5(encryptWithMD5Str, factor);
    
            String encryptWithSHA512Str = encryptWithSHA512(plainText, factor);
            String decryptWithSHA512Str = decryptWithSHA512(encryptWithSHA512Str, factor);
            System.out.println("采用MD5加密前原文密文:" + encryptWithMD5Str);
            System.out.println("采用MD5解密后密文原文:" + decryptWithMD5Str);
            System.out.println();
            System.out.println("采用SHA512加密前原文密文:" + encryptWithSHA512Str);
            System.out.println("采用SHA512解密后密文原文:" + decryptWithSHA512Str);
        }
    }

    也可以调用jasypt-1.9.2.jar包中一个main方法:org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI

    注:jasypt2.x版本可以使用,3.x不能使用

    找到maven仓库中的 jasypt-1.9.2.jar(路径是:xxx\reposhttp://www.devze.comitory\org\jasypt\jasypt\1.9.2)

    java -cp jasypt-1.9.2.jar  org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="test" password=salt algorithm=PBEWithMD5AndDES
    • -- input参数:你想要加密的密码
    • -- password参数:jasypt用来加密你的密码的密码
    • -- algorithm加密方式:使用默认就好了

    结果如下图,途中的output就是加密后的密文了。

    springboot jasypt2.x与jasypt3.x的使用方式

    3. 修改配置文件,把配置文件中要加密的字段改为:ENC(密文)

    yml中添加

    system:
      mysql:
        url: xxx.xxx.xx.xx
        username: username
        password: ENC(EM4fA1YBhd8OTcdl93w2QQ==)
    
    jasypt:
      encryptor:
        password: salt

    那么新的问题又来了,你把密码盐放在配置文件中,这些密码加密就相当于没加密

    5、将加密密钥作为启动运行参数

    以上我们的密钥也是保存在配置文件中的,一旦密钥泄露,信息被解密,安全隐患依然存在!

    因此我们可以通过将密钥设置为程序启动时的参数来避免!!!

    java -Djasypt.encryptor.password=salt -jar test.jar

    idea中如下配置运行:

    springboot jasypt2.x与jasypt3.x的使用方式

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号