美文网首页
SpringBoot配置文件属性加密

SpringBoot配置文件属性加密

作者: 飘逸峰 | 来源:发表于2020-10-27 15:15 被阅读0次

    摘要

    添加依赖

    implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3'
    

    配置文件

    jasypt:
      encryptor:
        #默认加密算法:PBEWITHHMACSHA512ANDAES_256,sha512+AES算法,安全性更高,但是需要 Java JDK 1.9+
        #本服务使用jdk1.8,所以使用 PBEWithMD5AndDES md5+des算法
        #默认使用 com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor 进行加解密 ,PooledPBEStringEncryptor可以对其加密的内容进行解密
        algorithm: PBEWithMD5AndDES
        # 加密密钥,使用方式 spring.datasource.password=ENC(密文),不要设置在配置文件中,建议使用环境变量或者启动参数: --jasypt.encryptor.password=123456
        password: 123456
        #设置密文前缀和后缀
        property:
          prefix: ENC(
          suffix: )
        iv-generator-classname: org.jasypt.iv.RandomIvGenerator
    

    可用属性

    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

    生成密文

    # jar下载地址:https://repo1.maven.org/maven2/org/jasypt/jasypt/1.9.3/jasypt-1.9.3.jar
    # 实际上使用maven或者gradle配置jasypt-spring-boot-starter依赖后,这个jar就已经下载到本地仓库了,去本地仓库找找吧
    #加密
    java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password=123456 algorithm=PBEWithMD5AndDES ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator input=newpwd
    
    #解密
    java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI password=123456 algorithm=PBEWithMD5AndDES ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator input=BwNPdUi+syCTKFj/nlbI5fAtGUKuhN8r
    

    属性加密

    spring:
    #数据源配置
      datasource:
        url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useTimezone=true&serverTimezone=GMT%2B8
        username: root
        password: ENC(BwNPdUi+syCTKFj/nlbI5fAtGUKuhN8r)
        driver-class-name: com.mysql.cj.jdbc.Driver
    
      #配置redis连接
      redis:
        host: 127.0.0.1
        password: ENC(FE4cpSc+2u9NFEY+Q5n9kNSxW6BUiNXGNTUPuhoQbPA=)
    

    说明

    • 配置文件将需要加密的属性使用ENC(密文)的方式进行配置,密文前缀和后缀可以在配置文件中进行配置
    • jasypt-spring-boot-starter在服务运行时会自动对密文进行解密处理

    密钥传递方式

    #1.启动参数
    java -jar jasypt-spring-boot-demo.jar --jasypt.encryptor.password=password
    
    #2.系统属性
    java -Djasypt.encryptor.password=password -jar jasypt-spring-boot-demo.jar
    
    #3.环境变量
    jasypt:
        encryptor:
            password: ${JASYPT_ENCRYPTOR_PASSWORD:}
    
    JASYPT_ENCRYPTOR_PASSWORD=password java -jar jasypt-spring-boot-demo.jar
    
    #也可以先设置环境变量
    export JASYPT_ENCRYPTOR_PASSWORD=password
    java -jar jasypt-spring-boot-demo.jar
    

    代码中使用Jasypt

    /**
    * 引入jasypt-spring-boot-starter就会自动注入
    */
    @Resource
    private StringEncryptor stringEncryptor;
    
    public void StringEncryptor() {
        String encrypt = stringEncryptor.encrypt("newpwd");
        System.out.println(encrypt);
    
        String decrypt = stringEncryptor.decrypt(encrypt);
        System.out.println(decrypt);
    }
    
    

    非springboot项目

    依赖

    implementation 'org.jasypt:jasypt:1.9.3'
    

    工具类

    package com.example.utils;
    
    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;
    
    /**
     * <h1>属性加密工具类</h1>
     */
    public class JasyptUtil {
    
        public static String encrypt(String secretKey, String message) {
            return stringEncryptor(secretKey, message, true);
        }
    
        public static String decrypt(String secretKey, String message) {
            return stringEncryptor(secretKey, message, false);
        }
    
        /**
         * {@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
         */
        private 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.setAlgorithm("PBEWithMD5AndDES");
            //以下都是默认值
            config.setPoolSize("1");
            config.setKeyObtentionIterations("1000");
            config.setProviderName("SunJCE");
            config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
            //命令行执行时要指定这个参数
            config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
            config.setStringOutputType("base64");
            return config;
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:SpringBoot配置文件属性加密

          本文链接:https://www.haomeiwen.com/subject/zfdxvktx.html