zoukankan      html  css  js  c++  java
  • SpringBoot使用Jasypt加密属性配置

    一、前言

    一般我们在项目开发中的 yml 或者 properties 配置文件中都是明文的,如果一些敏感信息也使用明文方式配置的话,相对而言安全性就低了很多。

    大家都知道配置文件中的都是一些数据库连接用户名密码、一些第三方密钥等信息。

    开发和测试环境还好,但生产环境采用明文配置话将会有安全问题。

    所以我们谨慎点,下面我将使用 Jasypt 通用的加解密库进行加密配置。

    二、Jasypt 介绍

    Jasypt 是一个优秀的加密库,支持密码、Digest认证、文本、对象加密,此外密码加密复合RFC2307标准。

    它提供了单密钥对称加密和非对称加密两种脱敏方式。

    • 单密钥对称加密:一个密钥加盐,可以同时用作内容的加密和解密依据;
    • 非对称加密:使用公钥和私钥两个密钥,才可以对内容加密和解密;

    以上两种加密方式使用都非常简单,这里以 SpringBoot 集成单密钥对称加密方式做示例。

    三、集成 Jasypt

    1)引入 maven 依赖

    项目中使用 @SpringBootApplication 或 @EnableAutoConfiguration 注解,则直接引入以下依赖。

    任何系统属性,环境属性,命令行参数,application.properties\yaml 属性和任何其他自定义属性源可以包含加密属性

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

    2)yaml 配置

    配置 Jasypt

    1. 自定义前缀/后缀

    前缀后缀主要为了识别该值是否需要解密,如不按照该格式配置,在加载配置项的时候 jasypt 将保持原值,不进行解密

    jasypt:
      encryptor:
        property: # 自定义前缀后缀
          prefix: "^Cyan#["     # 前缀,默认 ENC(
          suffix: "]$"          # 后缀,默认 )
    

    不配置时使用默认 ENC(XXX)

    2. 配置秘钥

    秘钥是个安全性要求比较高的属性,一般不建议直接放在项目内

    ① 明文配置(不推荐)

    jasypt:
      encryptor:
        password: youpassword # 明文配置秘钥
    

    ② 环境变量参数注入

    jasypt:
      encryptor:
        password: ${JASYPT_ENCRYPTOR_PASSWORD}
    
    • 命令行:
      JASYPT_ENCRYPTOR_PASSWORD=youpassword java -jar springboot.jar
    • IDEA:
      image

    ③ 参数配置 jasypt.encryptor.password

    这种方法不需要在 yaml 或者 properties 文件中再配置 jasypt.encryptor.password
    将传递加密密码作为命令行参数运行如下:

    • 命令行:
      java -jar -Djasypt.encryptor.password=youpassword springboot.jar
    • IDEA:
      image

    3)加密/解密

    加密有两种方式

    1. 通过代码内调用API进行加密/解密

    @Autowired
    private StringEncryptor stringEncryptor;
    
    public void test() {
        // 原值
        String str = "92664CB0533C7DE2";
    
        // 加密
        String ciphertext = stringEncryptor.encrypt(str);
        System.out.println("加密值::" + ciphertext); // 加密值::AgQD8VjIbtFP0xXgTYEu+eeC+ldwVqlYisCJBESKSNE=
    
        // 解密
        String plaintext = stringEncryptor.decrypt(ciphertext);
        System.out.println("解密值::" + plaintext); // 解密值::92664CB0533C7DE2
    }
    

    2. 通过命令生成加密值

    不使用API可以通过如下命令生成;

    java -cp jasypt核心jar jasypt启动类 input="待加密文本" password=秘钥 algorithm=使用的加密算法

    • jasypt-1.9.2.jar:jasypt核心jar包,命令行需要进入核心包目录才能直接调用,否则写为绝对路径
    • org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI:jasypt启动类
    • input="待加密文本"
    • password=秘钥
    • algorithm=使用的加密算法

    java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="92664CB0533C7DE2" password=youpassword algorithm=PBEWithMD5AndDES

    image

    4)测试使用

    得到的密文后写到需要使用到的地方,加密后的字符串需要放到^Cyan#[]$或迷人的ENC()里面,格式如下:

    spring:
      application:
        name: jasypt-demo
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动
        name: defaultDataSource                     # 数据源名称
        url: jdbc:mysql://localhost:3306/all_booking?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
        username: ^Cyan#[riLm8px9CZ15Be5muiaKgQ==]$
        password: ^Cyan#[WngRig3JgY9DZ+RchEVUVA==]$
    

    在获取配置信息时,凡是指定格式如ENC(xxx) 包裹的值全部都会进行解密处理

    EncryptablePropertySourceWrapper对Spring属性管理类PropertySource做拓展,重写了getProperty(String name)方法,在获取配置时,凡是指定格式如ENC(x) 包裹的值全部解密处理。

    @SpringBootTest
    class JasyptDemoApplicationTests {
    
        @Autowired
        private DataSource dataSource;
    
        @Test
        void dataSourceTest() throws SQLException {
            System.err.println("Connection::" + dataSource.getConnection());
            // Connection::HikariProxyConnection@912784040 wrapping com.mysql.cj.jdbc.ConnectionImpl@1756f7cc
        }
    }
    
  • 相关阅读:
    问题:为命名空间,在此被用作类型和此项目作为引用添加将导致循环依赖项
    关于ObjectDataProvider绑定方法使用案例
    关于C#的数据绑定,存取数据库实例详解 (三)
    关于C#的数据绑定,存取数据库实例详解 (二)
    关于C#的数据绑定,存取数据库实例详解 (一)
    UOS安装到虚拟机上
    连接第三方接口
    工作流
    关于国产项目开发(数据库+服务器+架构)
    字段显示替换
  • 原文地址:https://www.cnblogs.com/Dm920/p/15437804.html
Copyright © 2011-2022 走看看