数据库文件加密

2023-11-07

配置MySQL数据库连接

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://121.196.xxx.xxx:3306/user?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

配置Redis缓存连接

redis.host=121.196.xxx.xxx
redis.port=6379
redis.password=111111

配置SMS短信服务连接

ali.sms.access_key_id=2zHmLdxAes7Bbe2w  
ali.sms.access_key_secret=bImWdv6iy0him8ly

这是典型的Spring Boot项目的application.properties配置文件。

一般来说,项目配置文件里,所有涉及信息安全的配置项(或字段)都应该做处理,典型的比如:

用到的数据库、缓存的密码
用到的中间件、消息队列的密码
用到的各种第三方服务的Access_Key
其他第三方服务的通信信息
…等等
总而言之,关键字段都应该保护起来,最起码不能用明文直接写在配置文件里!

如何加密配置项呢?
方法非常简单,几个步骤即可完成,先来演示一个最简版本:

1、首先建立一个基础的Spring Boot工程

这就不再赘述了

2、引入jasypt-spring-boot加密组件

通过jasypt-spring-boot这个开箱即用的加密组件来引入Jasypt这个强大的加密库

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

3、配置加密密钥

在Spring Boot的项目配置文件application.properties里新增如下配置:

jasypt.encryptor.password=CodeSheep
可以理解为jasypt会使用这个自定义加密密钥,对配置文件里的重要项进行加密。

4、加密测试

为了便于测试,我们直接扩展Spring Boot项目的启动类,项目启动时执行加密测试代码,直接看效果

@SpringBootApplication
public class SpringBootConfigEncryptApplication implements CommandLineRunner {

    @Autowired
    private ApplicationContext appCtx;

    @Autowired
    private StringEncryptor codeSheepEncryptorBean;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootConfigEncryptApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        Environment environment = appCtx.getBean(Environment.class);

        // 首先获取配置文件里的配置项
        String mysqlOriginPswd = environment.getProperty("spring.datasource.password");
        String redisOriginPswd = environment.getProperty("redis.password");
        String aliSmsOriginAk = environment.getProperty("ali.sms.access_key_secret");

        // 打印解密后的结果
        System.out.println( "MySQL原始明文密码为:" + mysqlOriginPswd );
        System.out.println( "Redis原始明文密码为:" + redisOriginPswd );
        System.out.println( "阿里云SMS原始AccessKey密码为:" + aliSmsOriginAk );
    }
}    

运行项目,控制台打印:

MySQL原始明文密码为:123456
Redis原始明文密码为:111111
阿里云SMS原始AccessKey密码为:bImWdv13da894mly
=====================================
MySQL原始明文密码加密后的结果为:IV7SyeQOfG4GhiXeGLboVgOLPDO+dJMDoOdmEOQp3KyVjruI+dKKeehsTriWPKbo
Redis原始明文密码加密后的结果为:litUkxJ3fN6+//Emq3vZ+y4o7ZOnZ8doOy7NrgJIDLoNWGG0m3ygGeQh/dEroKvv
阿里云SMS原始AccessKey密码加密后的结果为:MAhrOs20DY0RU/c1IKyLCt6dWZqLLOO4wUcK9GBgSxNII3C+y+SRptors+FyNz55xNDslhDnpWllhcYPwZsO5A==

5、修改配置文件,替换待加密配置项

我们拿到上一步得到的加密结果,将配置文件中的原始明文密码替换成上一步对应的结果即可,就像这样:

image

所以墙裂建议配置文件里的所有重要信息都这样处理!

6、查看密码解密结果

@SpringBootApplication
public class SpringBootConfigEncryptApplication implements CommandLineRunner {

    @Autowired
    private ApplicationContext appCtx;

    @Autowired
    private StringEncryptor codeSheepEncryptorBean;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootConfigEncryptApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        Environment environment = appCtx.getBean(Environment.class);

        // 首先获取配置文件里的配置项
        String mysqlOriginPswd = environment.getProperty("spring.datasource.password");
        String redisOriginPswd = environment.getProperty("redis.password");
        String aliSmsOriginAk = environment.getProperty("ali.sms.access_key_secret");

        // 打印解密后的结果
        System.out.println( "MySQL原始明文密码为:" + mysqlOriginPswd );
        System.out.println( "Redis原始明文密码为:" + redisOriginPswd );
        System.out.println( "阿里云SMS原始AccessKey密码为:" + aliSmsOriginAk );
    }
}   

打印结果:

MySQL原始明文密码为:123456 Redis原始明文密码为:111111
阿里云SMS原始AccessKey密码为:bImWdv13da894mly

很明显,在代码中使用时,jasypt-spring-boot组件会自动将ENC()语法包裹的配置项加密字段自动解密,数据得以还原。

这时候我想肯定很多小伙伴表示疑惑,典型的比如:

1、加密密钥必须放在ENC()中?为什么是ENC?

2、虽然说原始涉及信息安全的配置项被加密,但是自定义的加密密钥jasypt.encryptor.password=CodeSheep假如泄露了,别人不还是有几率可以解密的吗?

针对这些问题,继续往下看。

自定义加密前后缀
如果不愿意使用jasypt默认提供的ENC来标记加密字段,完全可以换成自定义的前后缀标记,比如我想换成CodeSheep()来标记加密字段,此时只需要在配置文件里配置一下前后缀即可:

jasypt.encryptor.property.prefix=CodeSheep(
jasypt.encryptor.property.suffix=)

这时候加密字段就可以放在CodeSheep()标记的字段中:

image

让加密更安全
虽然经过上文的加密,涉及信息安全的配置项肯定会变得更安全,这个毋庸置疑!

但是假如配置文件里的自定义加密密钥jasypt.encryptor.password=CodeSheep泄露了,那我们的加密字段也还是有可能被别人解密,为此,有几项工作可以让加密变得更加安全。

1、使用自定义加密器

上文实验加密时,使用的是默认的加密规则,这一点会让当自定义加密密钥泄漏时可能变得不安全。为此我们可以自定义加密规则。

自定义加密规则非常简单,只需要提供自定义的加密器配置类即可,比如我这里自定义一个名为 codeSheepEncryptorBean类型的加密器:

@Configuration
public class CodeSheepEncryptorCfg {

    @Bean( name = "codeSheepEncryptorBean" )
    public StringEncryptor codesheepStringEncryptor() {

        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();

        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("CodeSheep");
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);

        return encryptor;
    }
}

注意这里Bean的名字name是需要显式指定的(默认的名字是jasyptStringEncryptor),如果像这里一样用的自定义名字,则还需要在Spring Boot的application.properties配置文件中来指定bean的名字,就像这样:

jasypt.encryptor.bean=codeSheepEncryptorBean

2、加密密钥不要写在配置文件中

如果觉得上面这种方式还是可能会导致加密密钥泄露的话(毕竟还是写在了配置文件中),那我们干脆可以直接将加密密钥从配置文件中拿掉,取而代之的有三种方式:

方式一:直接作为程序启动时的命令行参数来带入

java -jar yourproject.jar --jasypt.encryptor.password=CodeSheep

方式二:直接作为程序启动时的应用环境变量来带入

java -Djasypt.encryptor.password=CodeSheep -jar yourproject.jar

方式三:甚至可以作为系统环境变量的方式来带入
比方说,我们提前设置好系统环境变量JASYPT_ENCRYPTOR_PASSWORD = CodeSheep,则直接在Spring Boot的项目配置文件中做如下配置即可:

jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}

这时候也会安全得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库文件加密 的相关文章

  • 是否可以在 Spring Batch 中结合分区和并行步骤?

    我只是想知道它在 Spring Batch 中可行吗 Step1Step2 流程 gt 流程1 流程2 流程3 Step3 其中每个flow1 gt 划分为 5 个 GridSizeflow2 gt 划分为 5 个 GridSizeflow
  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 为什么我在 Mac 上看到“java.lang.reflect.InaccessibleObjectException: Unable to make private java.nio.DirectByteBuffer(long,int)accessibl

    我已经在工作中愉快地构建代码好几天了 但突然我的一个项目 不是全部 失败并出现此错误消息 看看下面的答案吧 我是如何修复它的 起初我用谷歌搜索 看到很多有这个问题的人正在使用 Java 16 但我认为 错误 我正在使用 Java 11 因为
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • 尝试在没有 GatewayIntent 的情况下访问消息内容

    我希望每当我写一条打招呼的消息时 机器人都会在控制台中响应一条消息 但它只是给我一个错误 JDA MainWS ReadThread WARN JDA Attempting to access message content without
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序

随机推荐

  • 云服务器应用镜像和系统镜像一般选哪个好些?

    一般推荐选择安装系统镜像 安装纯净的操作系统 这样的话操作系统是纯净的未安装过任何环境和程序的 方便我们操作 1 服务器的镜像和操作系统是可以直接更换的 我们在阿里云的服务器后台直接就可以更换操作系统镜像 重装系统的 而且是免费不花钱的1分
  • 【技术案例】Firefly-RK3399多路视频编解码

    Firefly RK3399开源板拥有强大的视像处理器 VPU 能够流畅的实现H 264编解码功能 可以同时进行两路视频编码和五路视频解码 在应用方面 多路编解码功能可以更优秀地应用于同时录像和播放多个视频的场景 1分钟视频 一起先来了解下
  • jquery的find和children区别

    jQuery find方法可以找到任意深度的子元素 而children方法只能找到第一级的子元素 运行一下以下的代码就知道 div div
  • 微信小程序wx.getLocation审核不通过的解决方法

    写这篇文字的同时 博主已经被小程序接口审核拒了12次了 几乎每次都是 1 你好 你的小程序 xxxxxx 申请的wx getLocation接口因你提供的申请原因 辅助图片 网页 视频内容无法确认申请接口使用场景审核不通过 建议修改后重新提
  • AV1,实时编码READY

    点击上方 LiveVideoStack 关注我们 一款编码器的成功 不仅需要大量的金钱 还需要耐心 AV1定稿三年后 是时候为它庆祝了 文 包研 不知不觉 距离AV1完成定稿已经过去了三年多 这个新的视频编码标准已经获得了工业界认可 换句话
  • 02智慧城市分层架构

    一张图读懂一个产业之智慧城市分层架构 智慧城市的网络通讯技术 ICT 架构自下而上包含五层 依次为 物联感知层 网络通信层 计算存储层 数据与服务融合层 智慧应用层 除基础架构外 还包含建设管理体系 安全保障体系和运维管理体系
  • 用Python和Pygame写游戏-从入门到精通(实战一:涂鸦画板1)

    用Python和Pygame写游戏 从入门到精通 实战一 涂鸦画板1 从这次开始 我会由简单到困难 其实也不会困难到哪里去 讲几个例程 每一个例程都是我自己写 或者修改 那样的话我会提供原始出处 的 都具有一定的操作性和娱乐性 例程中汇尽量
  • flutter 监听器ValueListenableBuilder

    final ValueNotifier
  • Selenium滚动条处理

    Selenium是一个用于Web应用程序自动化测试工具 可以直接运行在浏览器中 针对页元素来进行定位并模仿认为操作 但是却无法控制滚动条 这时候只能借助JS了 selenium提供了一个操作js的方法 execute script 可以直接
  • mysql show技巧

    mysql show技巧 当我们show的内存列数比较多时 会出现以下情况 很不方便不看 mysql gt show proc backends 此时 我们可以使用一个小技巧 下面看起来就很友好了 mysql gt show proc ba
  • git push报错 Missing or invalid credentials

    zys zys virtual machine work cpp git push origin master Missing or invalid credentials Error connect ECONNREFUSED run us
  • Unity开发:一个PC项目转WebGL遇到的问题解决汇总

    这段时间遇到一个PC版本发布WebGL的工程 遇到很多的问题 在这里做下记录 1 发布报错 程序中出现DLL调用的情况 删除调用DLL相关代码 发布路径不要出现中文 2 WebGL无法通过IO流读取本地json文件 改成TextAsset绑
  • Web前端:html烟花代码

    代码如下
  • 【c语言】新手初学while循环,for循环的一些想法与思考

    循环语句有三种 while循环 for循环 do while循环 由于只学了前两种 因此只能将两种进行比较 但在比较两者前 我认为新手有必要认真的学习良好的代码习惯 这里我使用的是 高质量 C C 编程指南 尽管年代比较久远但依旧受益良多
  • 一、基础架构

    架构是什么 软件架构指软件系统的顶层结构 主要是由系统是一群关联个体组成 个体可以是模块或者子系统 他们按照某种特定的规则来运作和协作 系统架构的目的 架构设计的主要目的是为了解决软件系统复杂度带来的问题 要有的放矢 不是胡编乱造 这个结论
  • HTML5特效动画

    11 10款造型奇特的CSS3进度条 Loading动画DEMO演示 10款造型奇特的CSS3进度条 Loading动画 今天我们要分享10款造型奇特的CSS3进度条 Loading动画 这10款进度条应用不仅有创意的外观 而且还有非常特别
  • VS Code插件live server的安装和使用

    https blog csdn net sinat 37024730 article details 128902967
  • MS08-067远程代码执行漏洞(CVE-2008-4250)

    MS08 067远程代码执行漏洞 CVE 2008 4250 Windows Server服务RPC请求缓冲区溢出漏洞复现 文章目录 MS08 067远程代码执行漏洞 CVE 2008 4250 Windows Server服务RPC请求缓
  • anaconda使用系列教程--5)安装anaconda环境到指定位置

    背景 anaconda的环境都比较大 如果安装到根目录很快就会把根目录占满 最好能指定新建环境的安装路径 方法 方法就是在conda create命令加上选项 prefix即可 安装虚拟环境到指定路径的命令如下 conda create p
  • 数据库文件加密

    配置MySQL数据库连接 spring datasource driver class name com mysql jdbc Driver spring datasource url jdbc mysql 121 196 xxx xxx