• (五)配置文件的属性加密


    在micro service体系中,有了config server,我们可以把配置存放在git、svn、数据库等,普通的web项目也基本上是把配置存放在配置文件中。如果我们把大量的配置信息都放在配置文件中是会有安全隐患的,那么如何消除这个隐患呢?最直接的方式就是把配置信息中的一些敏感信息(比如数据库密码、中间件密码)加密,然后程序在获取这些配置的时候解密,就可以达到目的。这个时候,jasypt框架就派上用场了。

    Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and without the need of having deep knowledge on how cryptography works.

    • High-security, standards-based encryption techniques, both for unidirectional and bidirectional encryption. Encrypt passwords, texts, numbers, binaries...
    • Transparent integration with Hibernate.
    • Suitable for integration into Spring-based applications and also transparently integrable with Spring Security.
    • Integrated capabilities for encrypting the configuration of applications (i.e. datasources).
    • Specific features for high-performance encryption in multi-processor/multi-core systems.
    • Open API for use with any JCE provider.
    • ...and much more

    意思其实就是可以把Jasypt这个Java库当成是一个黑盒子,无需深入了解里面怎么运作的,可以拿来直接用(当然,作为码农我们还是要去一探究竟的,个人兴趣自己看吧)。现在基本上项目都集成spring boot了,因此我们可以使用jasypt-spring-boot-starter

    1. 引入pom包

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

    2. 找到maven仓库中的 jasypt-1.9.2.jar(路径是:.m2 epositoryorgjasyptjasypt1.9.2

    3. 调用jasypt-1.9.2.jar包中一个main方法org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI ,源码参考:

    package org.jasypt.intf.cli;
    
    import java.util.Properties;
    import org.jasypt.intf.service.JasyptStatelessService;
    
    public final class JasyptPBEStringEncryptionCLI
    {
      private static final String[][] VALID_REQUIRED_ARGUMENTS = { { "input" }, { "password" } };
      private static final String[][] VALID_OPTIONAL_ARGUMENTS = { { "verbose" }, { "algorithm" }, { "keyObtentionIterations" }, { "saltGeneratorClassName" }, { "providerName" }, { "providerClassName" }, { "stringOutputType" } };
      
      public static void main(String[] args)
      {
        boolean verbose = CLIUtils.getVerbosity(args);
        try
        {
          String applicationName = null;
          String[] arguments = null;
          if ((args[0] == null) || (args[0].indexOf("=") != -1))
          {
            applicationName = JasyptPBEStringEncryptionCLI.class.getName();
            arguments = args;
          }
          else
          {
            applicationName = args[0];
            arguments = new String[args.length - 1];
            System.arraycopy(args, 1, arguments, 0, args.length - 1);
          }
          Properties argumentValues = CLIUtils.getArgumentValues(applicationName, arguments, VALID_REQUIRED_ARGUMENTS, VALID_OPTIONAL_ARGUMENTS);
          
          CLIUtils.showEnvironment(verbose);
          
          JasyptStatelessService service = new JasyptStatelessService();
          
          String input = argumentValues.getProperty("input");
          
          CLIUtils.showArgumentDescription(argumentValues, verbose);
          
          String result = service.encrypt(input, argumentValues.getProperty("password"), null, null, argumentValues.getProperty("algorithm"), null, null, argumentValues.getProperty("keyObtentionIterations"), null, null, argumentValues.getProperty("saltGeneratorClassName"), null, null, argumentValues.getProperty("providerName"), null, null, argumentValues.getProperty("providerClassName"), null, null, argumentValues.getProperty("stringOutputType"), null, null);
          
          CLIUtils.showOutput(result, verbose);
        }
        catch (Throwable t)
        {
          CLIUtils.showError(t, verbose);
        }
      }
    }
    View Code

    然后执行一下语句:

    java -cp jasypt-1.9.2.jar  org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="test" password=salt algorithm=PBEWithMD5AndDES

    -- input参数:你想要加密的密码
    -- password参数:jasypt用来加密你的密码的密码

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

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

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

    以上就可以达到目的。

    作者: zhangQ
    个人主页:https://www.yxzqy.com/
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    IO
    File
    jdbc
    HashMap
    网络通信
    lambda
    Queue
    反射
    Stack
    AC自动机题目选讲
  • 原文地址:https://www.cnblogs.com/zqyx/p/9687136.html
Copyright © 2020-2023  润新知