如何加密配置文件里的敏感数据

目录
  • 加密配置文件里面的敏感数据
  • 通用步骤(引入相关依赖)
    • 修改前的yml配置文件
  • 第一种做法
    • 修改后的yml配置文件
    • 测试是否可行
  • 第二种做法
    • 最终还是测试是否可行
  • 总结

加密配置文件里面的敏感数据

项目开发的时候,需要把数据存放到指定的数据库中(例如MySql、Oracle等),还有会使用缓存数据库提升性能的。

连接数据库相关的信息一般都是存放在配置文件里面,spring boot会帮我们注入到具体的对象里面。但是如果配置文件里面相关的敏感信息是以【明文】的方式存储,那么就会存在安全隐患

今天偶然想起是不是可以把敏感信息加密起来,然后写到配置文件里面,结果一搜,还真的有,特此记录一下!

通用步骤(引入相关依赖)

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

数据库信息

redis缓存信息

修改配置文件,加入密钥

修改前的yml配置文件

server:
  port: 9091
jasypt:
  encryptor:
    # 指定加密密码
    password: wxzkjtvvgt@44lvvz
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/encryp?serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: root1234
    username: root
  application:
    name: test-encrypt
  redis:
    port: 6379
    host: 127.0.0.1
    password: iamamg

第一种做法

@Test
    void testEncrypt() {
        final String redisHostEncrypt = stringEncryptor.encrypt("127.0.0.1");
        final String redisPasswordEncrypt = stringEncryptor.encrypt("iamamg");
        final String mysqlUrl = stringEncryptor.encrypt("jdbc:mysql://127.0.0.1:3306/encryp?serverTimezone=UTC");
        final String mysqlUserName = stringEncryptor.encrypt("root");
        final String mysqlPassword = stringEncryptor.encrypt("root1234");
        System.out.println("==================================");
        // 用这些加密的信息替换掉配置文件里面相关的配置项

        System.out.println("redis主机加密:" + redisHostEncrypt);
        System.out.println("redis密码加密:" + redisPasswordEncrypt);
        System.out.println("mysql用户名加密:" + mysqlUserName);
        System.out.println("mysql密码加密:" + mysqlPassword);
        System.out.println("mysqlUrl加密:" + mysqlUrl);
        System.out.println("===================================");
        System.out.println("redis主机解密:" + stringEncryptor.decrypt(redisHostEncrypt));
        System.out.println("redis密码解密:" + stringEncryptor.decrypt(redisPasswordEncrypt));
        System.out.println("mysql用户名解密:" + stringEncryptor.decrypt(mysqlUserName));
        System.out.println("mysql密码解密:" + stringEncryptor.decrypt(mysqlPassword));
        System.out.println("mysqlUrl解密:" + stringEncryptor.decrypt(mysqlUrl));
    }
==================================
redis主机加密:V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gw
redis密码加密:0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEY
mysql用户名加密:cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRF
mysql密码加密:/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0
mysqlUrl加密:NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb
===================================
redis主机解密:127.0.0.1
redis密码解密:iamamg
mysql用户名解密:root
mysql密码解密:root1234
mysqlUrl解密:jdbc:mysql://127.0.0.1:3306/encryp?serverTimezone=UTC

修改后的yml配置文件

可能你也观察到了,需要额外注意的一点就是,需要加密的数据项都使用了ENC()括起来了

server:
  port: 9091
jasypt:
  encryptor:
    # 加密密码
    password: wxzkjtvvgt@44lvvz
spring:
  datasource:
    url: ENC(NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb)
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: ENC(/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0)
    username: ENC(cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRF)
  application:
    name: test-encrypt
  redis:
    port: 6379
    host: ENC(V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gw)
    password: ENC(0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEY)

测试是否可行

	/**
     * 测试获取数据库中的数据总量
     */
    @Test
    void testSelectInMysql() {
        String sql = "SELECT COUNT(1) FROM T0001_TEST";
        final Integer num = jdbcTemplate.queryForObject(sql, Integer.class);
        System.out.println(num);
    }
    /**
     * 测试获取redis中指定key
     */
    @Test
    void testSelectInRedis() {
        final String name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

但是,大家且思考一下,我们当前yml配置文件里面依然存在着密钥,这是不是很不合理?只要解读到这个文件,密钥还是会被知道,所以这里提供另外一种做法

第二种做法

1.首先把yml文件里面的密钥记录下来,然后把配置去掉(其实就是把这个配置移到运行的时候才指定)

启动的时候加上-Djasypt.encryptor.password= 密钥 ;这里的密钥为 wxzkjtvvgt@44lvvz,如果密钥错误,项目是启动不成功的,通常报的错都是数据库连接失败,这也挺正常的,因为如果是错误的密钥,密文信息就无法解密,得到的自然是不符合的信息,所以会报错

# 就把关于密钥的部分移除,其他依旧不变
server:
  port: 9091
spring:
  datasource:
    url: ENC(NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb)
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: ENC(/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0)
    username: ENC(cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRF)
  application:
    name: test-encrypt
  redis:
    port: 6379
    host: ENC(V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gw)
    password: ENC(0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEY)

2.在IDEA里面启动程序的方式

3.打成jar包,命令行启动的方式

最终还是测试是否可行

此时模拟真实的三层开发

//controller代码

/**
 * @Author: Amg
 * @Date: Created in 17:45 2021/04/17
 * @Description: TODO
 */
@RestController
public class TestController {
    @Autowired
    TestServiceImpl service;
    @GetMapping("/count")
    public String getCount() {
        final Integer count = service.getCount();
        if (StringUtils.isEmpty(count)) {
            return "连接数据库出问题了";
        } else {
            return "连接数据库成功!当前数据量为:" + count;
        }
    }
}
//service代码
/**
 * @Author: Amg
 * @Date: Created in 17:46 2021/04/17
 * @Description: TODO
 */
@Service
public class TestServiceImpl {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public Integer getCount() {
        try {
            String sql = "SELECT COUNT(1) FROM T0001_TEST";
            return jdbcTemplate.queryForObject(sql, Integer.class);
        } catch (DataAccessException e) {
            e.printStackTrace();
            return null;
        }
    }
}

莫得问题!

总结

1、引入相关依赖

2、修改配置文件,加入密钥配置 / 启动的时候指定密钥

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring cloud config 配置文件加密方式

    前言 我们会使用git来保存我们项目的配置文件,但是文件中总有一些敏感数据,对于这些敏感数据我们通常需要给它加密,加密通常有两种加密方式,一种是对称加密,一种是非对称加密,对称加密简单方便,但是安全性没有非对称加密高,非对称加密需要生成证书,安全性比较高.但是请记住没有绝对的安全. 配置环境 java8 jce config server 的加密解密需要依赖与java Cryptography Extension (jce) 安装方式:可以参考里面的README,其实也很简单:把jdk下面 /j

  • Spring Boot加密配置文件特殊内容的示例代码详解

    有时安全不得不考虑,看看新闻泄漏风波事件就知道了我们在用Spring boot进行开发时,经常要配置很多外置参数ftp.数据库连接信息.支付信息等敏感隐私信息,如下 ​ 这不太好,特别是互联网应用,应该用加密的方式比较安全,有点类似一些应用如电商.公安.安检平台.滚动式大屏中奖信息等显示身份证号和手机号都是前几位4109128*********和158*******.那就把图中的明文改造下1. 引入加密包,可选,要是自己实现加解密算法,就不需要引入第三方加解密库 <dependency> &l

  • Spring Boot配置内容加密实现敏感信息保护

    在之前的系列教程中,我们已经介绍了非常多关于Spring Boot配置文件中的各种细节用法,比如:参数间的引用.随机数的应用.命令行参数的使用.多环境的配置管理等等. 为什么要加密? 可能很多初学者,对于配置信息的加密并不敏感,因为开始主要接触本地的开发,对于很多安全问题并没有太多的考虑.而现实中,我们的配置文件中,其实包含着大量与安全相关的敏感信息,比如:数据库的账号密码.一些服务的密钥等.这些信息一旦泄露,对于企业的重要数据资产,那是相当危险的. 所以,对于这些配置文件中存在的敏感信息进行加

  • 使用Springboot对配置文件中的敏感信息加密

    Springboot对配置文件的敏感信息加密 前言 最近公司对软件的安全问题比较在意,要求对配置文件中的敏感信息如数据库密码等进行加密.但是Springboot是一款高度集成的框架,如果仅仅是简单的对数据库密码进行加密了,由于连接数据库的操作是框架自己完成的,这就会造成不小的麻烦. 经过调研,找到了如下方式还比较方便. 项目配置 该项目用到了jasypt库.原理很简单,通过该库提供的方法进行敏感信息加密,生成密文xxxxx,然后将密文使用ENC()包裹起来. 添加依赖 <!-- jasypt场景

  • 如何加密配置文件里的敏感数据

    目录 加密配置文件里面的敏感数据 通用步骤(引入相关依赖) 修改前的yml配置文件 第一种做法 修改后的yml配置文件 测试是否可行 第二种做法 最终还是测试是否可行 总结 加密配置文件里面的敏感数据 项目开发的时候,需要把数据存放到指定的数据库中(例如MySql.Oracle等),还有会使用缓存数据库提升性能的. 连接数据库相关的信息一般都是存放在配置文件里面,spring boot会帮我们注入到具体的对象里面.但是如果配置文件里面相关的敏感信息是以[明文]的方式存储,那么就会存在安全隐患 今

  • SpringBoot加密配置文件的SQL账号密码方式

    目录 加密配置文件的SQL账号密码 1.在Maven项目中引入依赖 2.同时需要在application.yml配置文件中先配置密码 3.可以在测试用例中 4.最后在配置文件中放入加密后的字符串就行 对配置文件进行加密 第一步:pom文件加入依赖,如图 第二步:生成密钥 第三步:springboot配置文件中添加配置,如图 第四步:通过命令解密密码 加密配置文件的SQL账号密码 一般项目的配置文件里的信息都是明文的,导致有时候比较敏感的信息也直接暴露得超级明显,比如SQL的链接 账号 密码等.

  • Spring Cloud Config RSA简介及使用RSA加密配置文件的方法

    Spring Cloud 为开发人员提供了一系列的工具来快速构建分布式系统的通用模型 .例如:配置管理.服务发现.断路由.智能路由.微代理.控制总线.一次性Token.全局锁.决策竞选.分布式session.集群状态等等.分布式系统的协助需要一大堆的模型,使用Spring Cloud开发者能快速的建立支持实现这些模式的服务和应用程序.他们将适用于任何分布式环境,无论是开发者的个人电脑还是生产环境,还是云平台. 特性 Spring Cloud 专注于提供良好开箱即用的典型方案和可扩展方式. 分布式

  • springboot 配置文件里部分配置未生效的解决

    springboot 配置文件里部分配置未生效 最近用springboot搭了个项目,上线过段时间就会出现卡死,猜测是数据库连接池的连接被占满,用的连接池是druid,于是给项目加上了一个数据库连接池监控. 代码如下: @Configuration public class DruidConfiguration { /** * * 注册一个StatViewServlet * * @return * */ @Bean public ServletRegistrationBean DruidStat

  • Springboot 读取 yml 配置文件里的参数值

    目录 方式一 方式二 总结 方式一 1.yml配置 yml配置(示例): api: mes: MES_SOCKET: http://192.168.99.140:8081 2.读取 代码如下(示例): package com.jack.modules.wms.api.common.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; impor

  • 如何在Django配置文件里配置session链接

    Django默认支持Session,并且默认是将Session数据存储在数据库中的 修改session存取放在数据库中 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) session存在缓存里 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是me

  • C#为配置文件加密的实现方法

    本文实例讲述了C#为配置文件加密的实现方法,分享给大家供大家参考.具体实现方法如下: 一般来说,在web.config或app.config文件里我们经常会存储一些敏感信息,比如connectionStrings或者appSettings,比如像下面的文件. 复制代码 代码如下: <?xml version="1.0"?> <configuration>     <system.web>       <compilation debug=&qu

  • SpringBoot配置文件中数据库密码加密两种方案(推荐)

    SpringBoot项目经常将连接数据库的密码明文放在配置文件里,安全性就比较低一些,尤其在一些企业对安全性要求很高,因此我们就考虑如何对密码进行加密. 介绍两种加密方式:jasypt 可加密配置文件中所有属性值; druid 自带了加解密,可对数据库密码进行加密. jasypt 加解密 jasypt 是一个简单易用的加解密Java库,可以快速集成到 Spring 项目中.可以快速集成到 Spring Boot 项目中,并提供了自动配置,使用非常简单. 步骤如下: 1)引入maven依赖 <de

  • Spring Cloud Config配置文件使用对称加密的方法

    补充 使用Spring Cloud Config加密功能需要下载JCE扩展,用于生成无限长度的密文.链接:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html 下载完成之后解压,把得到到两个Jar包复制到$JAVA_HOME\jre\lib\security目录下. 简介 在真实项目环境下,我们不会在配置文件中明文存储密码等机密性文本,以防被窃.Spring Cloud Config提

随机推荐