• SpringBoot_加密配置中的敏感信息


    数据用户名和数据库密码加密为例

    我们将使用https://github.com/ulisesbocchio/jasypt-spring-boot这个开源项目提供的实现和插件,来帮助我们轻松的完成配置信息的加密。

    1、引入包

    pom.xml中引入jasypt提供的Spring Boot Starter

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

    2、配置加/解的密码

    在配置文件 application.yml 中加入加密需要使用的密码,如:

    # jasypt加密的密匙
    jasypt:
      encryptor:
        password: ABCDEFGHIJK

    3、测试用例中生成加密后的秘钥

         @Test
         void getEncrypt() {
             //对敏感信息进行加密
             String url = encrypt.encrypt("jdbc:mysql://localhost:3306/demo");
             String name = encrypt.encrypt("root");
             String password = encrypt.encrypt("123456");
             System.out.println(url+"----------------");
             System.out.println(name+"----------------");
             System.out.println(password+"----------------");
         }

    结果:

    jJW8vLCvy1NJc7Z37+MHY++2IxbAIU3F2PKywvVPgleSb+Y6VtLgQwrsI4YnOPkGg2+EPRWuhTftpv2iY4ck7mxTnXodNmMHarAS2Dvyp3c=----------------
    rYXxJV6dq1R5Nlbgf+oKnVHORjarrzc3YkANKwJvUhbDz+MLs1TZwTZm/yr9aQdM----------------
    w0/NoJF2XzxkDqRlGWgmslXcpTlVNQfqv+ylCFAae5SthDbpSsaMqickUsib0h0m----------------

    4、将加密后的字符串替换原明文

    # jasypt加密的密匙
    jasypt:
      encryptor:
        password: ABCDEFGHIJK
     ​
    mysql:
      url: ENC(FJqflLlLzTa2t8MvOUh5R6wGp8xgt1c7jbqm/AawsRSJvwySrN03P0CiVYT3a9kUEQqeQ7ly4ZDEGssAISUM9bZ/8KQZgo2SOEj/S05aBaI=)
      username: ENC(/v+5Q5u4oOCSyps9RdPhL/xlghEoXSL0uptr1npRoC9I3egOuWjYTJexkGGGgwp+)
      password: ENC(Hsqq32hosJvUKjA25e1hNq7TfkU+YiLNOYXzn6XWK51oE4LUWAeGcfSCh2Z/poz2)
     

    注意: ENC()DEC()一样都是 jasypt 提供的标识,分别用来标识括号内的是加密后的内容和待加密的内容。


    5、测试

    javaBean:

    @Data
    @Component
    @ConfigurationProperties(prefix = "mysql")
    public class Mysql {
        private String url;
        private String username;
        private String password;
    }

    测试:

        @Autowired
        private Mysql mysql;
    
        @Test
        void test() {
            System.out.println("mysql = " + mysql);
        }

    结果:

    mysql = Mysql(url=jdbc:mysql://localhost:3306/demo, username=root, password=123456)

    在springboot项目加载的时候就会将加密信息进行解密,就获得了我们之前的username和password了。


    6、思考

    根据上面的步骤,爱思考的你,也许会发现这样的问题:虽然敏感信息是加密了,但是我们通过配置文件也能看到jasypt.encryptor.password信息,我们是不是通过利用这个再把原始信息解密出来,这样的话岂不是还是不安全?

    上面的实现方式的确是会有这样的问题!所以,在实际应用的过程中,jasypt.encryptor.password的配置,可以通过运维小伙伴在环境变量或启动参数中注入,而不是由开发人员在配置文件中指定。

     

    部署时配置salt(盐)值

    1. 为了防止salt(盐)泄露,反解出密码.可以在项目部署的时候使用命令传入salt(盐)值:

      java -jar xxx.jar  -Djasypt.encryptor.password=Y6M9fAJQdU7jNp5MW
    2. 或者在服务器的环境变量里配置,进一步提高安全性,打开/etc/profile文件

      vim /etc/profile

      profile 文件末尾插入salt(盐)变量

      export JASYPT_PASSWORD = Y6M9fAJQdU7jNp5MW

      编译,使配置文件生效

      source /etc/profile

      运行

      java -jar -Djasypt.encryptor.password=${JASYPT_PASSWORD} xxx.jar
  • 相关阅读:
    数据结构(四十七)归并排序(O(nlogn))
    数据结构(四十六)插入排序(1.直接插入排序(O(n²)) 2.希尔排序(O(n3/2)))
    数据结构(四十五)选择排序(1.直接选择排序(O(n²))2.堆排序(O(nlogn)))
    数据结构(四十四)交换排序(1.冒泡排序(O(n²))2.快速排序(O(nlogn))))
    数据结构(四十三)排序的基本概念与分类
    策略模式(strategy pattern)
    多线程同步之读者写者问题
    多线程同步之信号量
    多线程同步之条件变量
    多线程同步之互斥量
  • 原文地址:https://www.cnblogs.com/mmdz/p/15428613.html
Copyright © 2020-2023  润新知