网络安全——SpringBoot配置文件明文加密

XTHS:第一步、XTHS:第二步、XTHS:第三步、XTHS:第四步 !就可以实现了。(但是前提,你要先对你的文本进行加密,然后按照ENC(加密文本),放到配置文件中)

一、前言

在日常开发中,项目中会有很多配置文件。比如SpringBoot项目核心的数据库配置、Redis账号密码配置都在propertiesyml配置文件

中。 如果这些信息以明文的方式存储,你的电脑被拿去修理,就会容易泄露,一旦被其他人获取到......你懂得...... 那么如何将配置文件

中的明文信息加密存储就变得至关重要,让我们一起来看下吧。

二、加密方式介绍

你想给你的兄弟分享你的考验资料,为了保证安全性,你选择使用加密。

为了保证安全性不能让人随便看到,是首先使用对称加密。你给它设置一个了密码。但是你在发送过程中内容被隔壁张三截获,在你告知

你兄弟密码的过程,又被截获,然后......你的考验资料泄露...

你被你兄弟臭骂了一顿,你灵机一动使用了另外一种方式:非对称加密。首先你让兄弟准备两把钥匙,自己留一把,然后另一把传输给你

使用它内容加密,最后再把加密的内容传输给你兄弟。这过程无论是钥匙还是加密内容都不担心被截获,因为只有你兄弟手中的那把钥匙

才能解密。你兄弟安全的收到考验资料,并没有泄露。你以为这种方式却对的安全,可以高枕无忧了......

但是有天你的兄弟背叛了你,把你的考验资料公之于众!

此时你才恍然大悟,这世界上根本没有绝对安全的加密方式!再可靠的加密,也挡不住捉摸不透的人心! 所以你决定,将考验资料永久

封存!你选择了哈希加密这种方式,它只管加密,不管解密!

(1)对称加密:

对称加密就相当于一个带锁宝箱,这个钥匙就是密钥(或者被称为盐值)。如果你想让别人想看的话,必须把钥匙给对应的人。这是最常

见的、最方便的加密方式。常见的对称加密算法包括 DES3DESAES

优点:
  • 强度和速度: 对称加密的优点是速度快,适用于大量数据的加密和解密。
缺点:

秘钥管理: 对称加密的关键在于密钥的管理。为了确保安全性,密钥必须在发送者和接收者之间安全地共享。但是,如果共享又是

一个问题,密钥一旦泄露,安全防线被攻陷,这又是个问题!。

(2)非对称加密:

你手中的钥匙被称为公钥,用来把宝箱锁上。你兄弟手中的钥匙被称为私钥,要想打开宝箱,必须要有对应的私钥才行!

优点:
  • 安全性: 非对称加密提供了更高的安全性,因为私钥是保密的,只有拥有私钥的人可以解密密文。
  • 密钥交换: 非对称加密可以用于安全地交换对称加密的密钥,从而解决了对称加密中秘钥分发的问题。
缺点:
  • 性能: 非对称加密通常比对称加密慢得多,因为涉及复杂的数学运算。
  • 复杂性: 使用非对称加密需要更多的计算资源和算法支持。

(3)哈希函数:

哈希函数主要用于数据完整性验证、密码存储、数字签名等。但是,由于哈希函数的单向性质,不能直接用于加密解密。

优点:
  • 不可逆性: 哈希函数是不可逆的,即无法从哈希值还原出原始数据,这增加了数据的安全性,特别适用于密码存储等场景。
  • 高效性: 哈希函数通常非常快速,对于大量数据的处理非常高效。
  • 固定长度输出: 无论输入数据的大小如何,哈希函数的输出长度是固定的,这使得处理结果更加一致。
  • 散列均匀性: 好的哈希函数应该将不同的输入映射到均匀分布的输出空间,避免冲突。
  • 数据完整性验证: 通过比较原始数据和哈希值,可以验证数据是否在传输或存储过程中被篡改。
缺点:

不可恢复性: 由于哈希函数是不可逆的,一旦数据被哈希化,就无法从哈希值还原出原始数据。这在某些应用场景下可能是缺点,

比如需要解密数据的情况。

冲突可能性: 哈希函数的输出是有限的,因此不同的输入可能会产生相同的哈希值,这被称为冲突。虽然好的哈希函数会减小冲突

的可能性,但仍然需要考虑。

彩虹表攻击: 针对较弱的哈希函数,攻击者可能使用预先计算的彩虹表来找到哈希值的原始数据。

哈希碰撞: 哈希碰撞指的是两个不同的输入产生相同的哈希值,攻击者可能利用这种情况来实现欺骗或篡改。

性能问题: 对于某些哈希函数,特别是在大规模数据上运行时,计算哈希值可能会影响性能。

三、SpringBoot项目配置文件加密

通过上面的加密方式介绍,我们使用对称加密,有人可能问这样不是不安全嘛?其实是安全的,得看你怎么用!

3.1 引入依赖**(XTHS:第一步)**

|----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 | <dependency> ``<groupId>com.github.ulisesbocchio</groupId> ``<artifactId>jasypt-spring-boot-starter</artifactId> ``<version>``2.1``.``2``</version> ``</dependency> <dependency> ``<groupId>org.jasypt</groupId> ``<artifactId>jasypt</artifactId> ``<version>``1.9``.``2``</version> ``</dependency> |

3.2 编写加密工具(XTHS:第二步)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | package com.zd.channel.cs.utils; import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig; /** ``* alibaba druid加解密规则: ``* 明文密码+私钥(privateKey)加密=加密密码 ``* 加密密码+公钥(publicKey)解密=明文密码 ``*/ public final class JasyptUtils { ``/** ``* 加密算法 ``*/ ``private static final String PBEWITHMD5ANDDES = ``"PBEWithMD5AndDES"``; ``/** ``* @param text 待加密原文 ``* @param crack 盐值(密钥) ``* @return 加密后的字符串 ``* @Description: Jasypt加密(PBEWithMD5AndDES) ``*/ ``public static String encryptWithMD5(String text, String crack) { ``//1.创建加解密工具实例 ``StandardPBEStringEncryptor encryptor = ``new StandardPBEStringEncryptor(); ``//2.加解密配置 ``EnvironmentStringPBEConfig config = ``new EnvironmentStringPBEConfig(); ``config.setAlgorithm(PBEWITHMD5ANDDES); ``config.setPassword(crack); ``encryptor.setConfig(config); ``//3.加密 ``return encryptor.encrypt(text); ``} ``/** ``* @param text 待解密原文 ``* @param crack 盐值(密钥) ``* @return 解密后的字符串 ``* @Description: Jasypt解密(PBEWithMD5AndDES) ``*/ ``public static String decryptWithMD5(String text, String crack) { ``StandardPBEStringEncryptor encryptor = ``new StandardPBEStringEncryptor(); ``EnvironmentStringPBEConfig config = ``new EnvironmentStringPBEConfig(); ``config.setAlgorithm(PBEWITHMD5ANDDES); ``config.setPassword(crack); ``encryptor.setConfig(config); ``return encryptor.decrypt(text); ``} ``public static void main(String[] args) { ``// String s = encryptWithMD5("明文", "密钥"); ``// System.out.println(s); ``String channelcs1 = decryptWithMD5(``"密文"``, ``"密钥"``); ``System.out.println(channelcs1); ``} } |

3.3 加密配置类(XTHS:第三步)

|-------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import org.jasypt.encryption.StringEncryptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; public class CustomEncryptorConfig ``implements StringEncryptor { ``/** ``* 加密解密的 密钥 ``*/ ``private String crack = ``"密钥"``; ``@Override ``public String encrypt(String s) { ``return JasyptUtils.encryptWithMD5(s,crack); ``} ``@Override ``public String decrypt(String s) { ``return JasyptUtils.decryptWithMD5(s,crack); ``} } |

3.4 配置文件(XTHS:第四步)

需要加密的内容使用:ENC(密码)格式书写。ENC 是一个特殊的前缀,用于标识被加密过的字符串。当你在配置文件中使用 ENC 前缀时,Jasypt 会自动识别这是一个被加密的属性,然后在应用启动时解密它并将解密后的值应用于相应的配置属性。这允许你在配置文件中以加密的方式存储敏感信息(如密码),同时在应用中解密并使用这些值。

|----------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | spring: ``datasource: ``dynamic: ``datasource: ``master: ``#type: com.zaxxer.hikari.HikariDataSource ``driver-``class``-name: com.mysql.jdbc.Driver ``url: ...... ``username: root ``password: ENC(3hoLALpSHwctWRbBFJGy1x40gMv78JEG) ``slave: ``#type: com.zaxxer.hikari.HikariDataSource ``driver-``class``-name: com.mysql.jdbc.Driver ``url: ...... ``username: root ``password: ENC(3hoLALpSHwctWRbBFJGy1x40gMv78JEG) ``hikari: ``minimum-idle: ``5 ``maximum-pool-size: ``60 ``connection-timeout: ``30000 ``idle-timeout: ``600000 ``max-lifetime: ``1800000 |

3.5 更安全一些

上面我们是把密钥写在了代码中,这样做也是有些不太安全的。我们可以使用命令行的方式将密钥传入。

在配置文件中加上如下的配置,用于接收启动项目时传入的配置参数:

|-------|-------------------------------------------------------------------|
| 1 2 3 | my: ``encrypted: ``password: ${jasypt.encryptor.password} |

|---|-------------------------------------------------------------------|
| 1 | java -jar your-application.jar -Djasypt.encryptor.password=你的密钥 |

生成密文时,我们也可以不适用工具类,而是使用命令,步骤如下:

  1. 在此目录下,打开命令行(win + R -> 进入jar包所在目录)、或者git(在jar包所在目录->邮件打开Git Bash here),执行加密命令:

  2. 加密:

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="要加密的值" password="加密密码" algorithm="加密算法"

|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 | java -cp jasypt-``1.9``.``2``.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=``"test" password=``"crack" algorithm=``"PBEWITHMD5ANDDES" |

  • 解密:
    java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="加密后的值" password="加密密码" algorithm="加密算法"

|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 | java -cp jasypt-``1.9``.``2``.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input=``"gSBst2q0Kp06AJ9ZpTkwNg==" password=``"crack" algorithm=``"PBEWITHMD5ANDDES" |

网络安全学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

需要网络安全学习路线和视频教程的可以在评论区留言哦~

最后
  • 如果你确实想自学的话,我可以把我自己整理收藏的这些教程分享给你,里面不仅有web安全,还有渗透测试等等内容,包含电子书、面试题、pdf文档、视频以及相关的课件笔记,我都已经学过了,都可以免费分享给大家!
    给小伙伴们的意见是想清楚,自学网络安全没有捷径,相比而言系统的网络安全是最节省成本的方式,因为能够帮你节省大量的时间和精力成本。坚持住,既然已经走到这条路上,虽然前途看似困难重重,只要咬牙坚持,最终会收到你想要的效果。

黑客工具&SRC技术文档&PDF书籍&web安全等(可分享)

结语

网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做"正向"的、结合"业务"与"数据"、"自动化"的"体系、建设",才能解人才之渴,真正的为社会全面互联网化提供安全保障。

特别声明:

此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施

,从而减少由网络安全而带来的经济损失

相关推荐
网络研究院2 分钟前
人工智能和量子时代的网络安全
网络·人工智能·安全·研究·通信·观点
火绒终端安全管理系统3 分钟前
火绒终端安全管理系统V2.0——行为管理(软件禁用+违规外联)
网络·安全·网络安全·火绒安全·火绒
网络安全-杰克3 分钟前
网络安全风险评估工作 依据 网络安全风险评估机制
网络·安全·web安全
shan~~44 分钟前
springboot完成复制一个word内容包括格式到另外一个word
spring boot·后端·word
Suckerbin1 小时前
Prime: 1靶场渗透测试
学习·安全·网络安全
执念WRD2 小时前
常见CMS漏洞之二:DeDeCMS
安全·网络安全·可信计算技术·dedecms
tatasix2 小时前
服务安全认证概述与基础认证方式
安全·microsoft
不修×蝙蝠3 小时前
SpringBoot 第二课(Ⅰ) 整合springmvc(详解)
java·spring boot·后端·spring·整合springmvc
程序员阿明3 小时前
spring boot maven一栏引入本地包
spring boot·后端·maven