zoukankan      html  css  js  c++  java
  • SpringBoot中的配置文件信息加密

    0.背景

    在SpringBoot项目中,有的配置文件信息比较敏感,比如数据库的密码信息等,直接以明文的形式写在配置文件中或许并不安全.


    1.步骤

    1.1 pom文件

    依赖中加入

            <!-- 配置加密 -->
            <dependency>
                <groupId>com.github.ulisesbocchio</groupId>
                <artifactId>jasypt-spring-boot-starter</artifactId>
                <version>3.0.4</version>
            </dependency>
    

    插件中加入

    注意此处的 configuration节点,默认是项目的properties文件,你没移动位置可以去掉这个节点,这里我配置文件自定义了新路径.

                <plugin>
                    <groupId>com.github.ulisesbocchio</groupId>
                    <artifactId>jasypt-maven-plugin</artifactId>
                    <version>3.0.4</version>
                    <configuration>
                        <path>file:./config/application.yml</path>
                    </configuration>
                </plugin>
    

    1.2 配置文件修改

    将要加密的信息用DEC()包裹,即DEC(待加密信息),例如:

    # 原来的加密信息
    yang.password=admin123
    # 修改为
    yang.password=DEC(admin123)
    

    1.3 mvn命令加密文件

    password=后为密码,注意没有""包裹,你写了"的话,那么你的密码也包括",下方示例为设置密码为yang37

    mvn jasypt:encrypt -Djasypt.encryptor.password=yang37
    

    执行该条mvn命令后,配置文件中的对应部分的信息会自动更改为:

    yang.password=ENC(加密的结果)
    

    好,到此这一小节目的达到了,你可以不用看这节剩下的内容.

    1.3.1 扩展1: 变回去明文

    如果你想要变回去原文,执行下面这个命令:

    mvn jasypt:decrypt -Djasypt.encryptor.password=yang37
    

    这时配置信息会打印在控制台,不会再次把配置文件给你改回去,你可以手动复制过去(打印的是配置文件全文).

    1.3.2 扩展2: 咋感觉作者ENC、DEC写反了?

    不要曲解作者的设计意图.

    encrypt:加密

    decrypt:解密

    我认为设计者的意图是,ENC-密文,DEC-明文,代码写多了老下意识的认为DEC()这个是解密方法...还难受里面不是密文串,其实改成{}、[]之类的我比较好接受.

    1.3.3 扩展3: mvn在哪执行

    idea里面直接点这个.

    image-20211113035628083

    1.3.4 手动计算密文

    如果你闲的慌,不想用maven插件...你可以去掉那个pom的那个plugin,然后直接手动写代码计算加密值,参考代码.

       		BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
            textEncryptor.setPassword("密码");
            String res = textEncryptor.encrypt("待加密值");
    

    上面的res就是你加密的结果,还需要你手动替换配置文件里面的对应的配置信息.

    yang.password=ENC(加密的结果)
    

    1.4 项目启动

    解密总要密文串吧?你刚才是手动执行命令输入的密码,项目中的密码从哪来?

    方案多种,反正目的就是为了让程序知道你的密码是啥,下面列举两种.

    1.4.1 直接启动

    java -jar xx.jar --jasypt.encryptor.password=你的密码
    

    1.4.2 利用环境变量

    配置文件中编写下面的信息:

    # 配置加密
    jasypt:
      encryptor:
        password: 你的密码
    

    你肯定会疑惑,密码写这里我还加密干嘛...所以,我们要把密码换个地方存储.

    这里我利用环境变量,取的名字叫BOOT_PWD,这个可以自定义,不是规定值.

    所以我把上面的配置改成这样:

    ${环境变量名:默认值}

    # 配置加密
    jasypt:
      encryptor:
        password: ${BOOT_PWD:get valueEnv error!}
    
    1.4.2.1 Linux中

    编辑当前用户的环境变量

    vim ~/.bash_profile
    

    末尾追加环境变量值

    这个BOOT_PWD可以自己定义,不是规定值.

    export BOOT_PWD=yang37
    

    保存后刷新配置

    source ~/.bash_profile
    

    可以用echo命令看看生效没

    echo $BOOT_PWD
    

    设置好环境变量后直接启动即可,不需要再带上面那个jasypt.encryptor.password参数.

    1.4.2.2 win中

    新建的时候变量值直接写密码就行,没有特殊格式.

    编辑好了记得重启你的IDE,新加的这个环境变量才会加载进来.

    image-20211113040432207

    设置好环境变量后直接启动即可,不需要再带上面那个jasypt.encryptor.password参数.

    1.5 验证

    如果你放心解密有没有成功,可以在启动类打印下信息,我的demo代码.

    package cn.yang37.demo;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.core.env.ConfigurableEnvironment;
    
    
    @SpringBootApplication
    public class DemoApplication {
    
        private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);
    
        public static void main(String[] args) {
            ConfigurableEnvironment environment = SpringApplication.run(DemoApplication.class, args).getEnvironment();
    
            // 获取环境变量中的 BOOT_PWD
            String boot_pwd = environment.getProperty("BOOT_PWD");
            // 上面run方法执行完成,项目启动,配置文件中有个配置值vxPush.admin.appToken也加载进去了,注意启动完已经给你解密好了.
            String appToken = environment.getProperty("vxPush.admin.appToken");
    
            log.info("配置文件密码: {}", boot_pwd);
            log.info("配置文件解密测试 - appToken: {}", appToken);
    
            log.info("\nvx-pusher run success ...\n");
        }
    
    }
    
  • 相关阅读:
    测试软件—禅道BUG管理工具
    C语言 线性表的操作~(未完)
    数据库考纲~
    圣杯布局和双飞翼布局总局
    总结布局用法
    springboot~入门第三篇~与mybatis整合~(未完)
    微信小程序里 wx:for和wx:for-item区别(补充下wx:key)
    对比下小程序语法和Vue语法异同
    视频转换 rtsp 流 转rtmp流播放(待完善)
    Vue钩子函数~
  • 原文地址:https://www.cnblogs.com/yang37/p/15547190.html
Copyright © 2011-2022 走看看