配置文件藏密码?太危险!教你 Spring Boot3 最硬核加密方案
时间:2025-11-05 09:35:11 出处:域名阅读(143)
在企业级开发中,配置Spring Boot 项目几乎离不开各种外部服务:数据库、文件危险缓存、藏密消息队列、码太支付网关、教S加密OAuth2 认证……这些组件的硬核连接凭证和 API Key 通常都被放进 /etc/app/config/application.yml 或 application.properties 中。
然而,配置一旦处理不当,文件危险这些看似普通的藏密配置文件,就可能成为安全体系中的码太最大破口:代码被提交到 GitHub/Gitee,或者日志误打到了集中式系统(如 ELK),教S加密都会让黑客轻松获取敏感信息。硬核

本文将结合常见的配置开发场景,逐一分析配置文件安全中的文件危险典型误区,并给出 Spring Boot3 下更为稳妥的藏密加密与防护实践,帮助开发者构建真正安全的配置管理体系。
误区一:把密码明文写在配置文件里
常见写法:
复制spring: datasource: url: jdbc:mysql://localhost:3306/demo username: root password: root1234561.2.3.4.5.在本地调试时这样或许没问题,但如果代码上传到远程仓库,或在云服务器上部署,这些凭证将毫无遮拦地暴露。
正确做法:环境变量注入
复制spring: datasource: url: jdbc:mysql://localhost:3306/demo username: ${DB_USERNAME} password: ${DB_PASSWORD}1.2.3.4.5.部署时配置环境变量:
复制export DB_USERNAME=root export DB_PASSWORD=xxxxxx1.2.或者使用 Profiles 区分环境:
/etc/app/config/application-dev.yml(开发)/etc/app/config/application-prod.yml(生产)这样可以在不同环境独立管理敏感信息。
误区二:依赖 .gitignore 忽略敏感配置
一些团队把配置文件加到 .gitignore:
复制application.yml1.他们以为这样就万事大吉,但只要有人手滑手动提交,敏感数据依然可能被上传。更麻烦的是,企商汇不同环境需要不同配置,容易出现“错环境”的情况。
正确做法:
Git 仓库中只保留通用配置(端口、日志级别等)。敏感信息全部外部化,交给环境变量或配置中心管理(如 Nacos、Apollo、Spring Cloud Config)。生产环境中,推荐配合配置中心的加密存储能力。误区三:用 Base64 假装加密
错误示例:
复制spring: datasource: password: YWRtaW4xMjM=1.2.3.这种写法只是一种编码,而非真正的加密,任何人都能轻松解码。
正确做法:使用真正的加密工具。 例如 Jasypt:
复制encrypt.sh input=123456 password=secretkey1.得到密文后存放:
复制spring: datasource: password: ENC(xxxxxxxx)1.2.3.运行时,由 Jasypt 自动解密。 更高级的方式是用 非对称加密 或配合配置中心的内置加密功能。
误区四:把密钥和密文放一起
错误示例:
复制jasypt: encryptor: password: secretkey spring: datasource: password: ENC(abcdefg)1.2.3.4.5.6.7.8.看似加密,其实毫无意义。拿到文件的人同时拿到了密钥和密文,自然可以解密。
正确做法:
绝不把加密密钥写进仓库。通过环境变量传入: 复制java -Djasypt.encryptor.password=secretkey -jar app.jar1. 或者放进云服务提供的 KMS(Key Management Service),亿华云如 AWS KMS、阿里云 KMS、Vault。误区五:只关注数据库密码
很多开发者只对数据库连接加密,却忽视了其他敏感字段:
第三方支付 API KeyRedis / RabbitMQ / Elasticsearch 密码JWT secretOAuth2 Client clientSecret正确做法:
统一收集所有敏感信息,纳入同一加密与管理体系。JWT/OAuth2 相关的凭证必须设置过期时间,并且支持快速替换。第三方平台的 Key,务必放入配置中心或环境变量,不要硬编码到 /src/main/java/com/icoderoad/ 的业务逻辑中。误区六:在日志中打印敏感信息
错误示例:
复制log.info("Database password: {}", dataSource.getPassword());1.日志往往会被集中采集,敏感信息就此泄露。
正确做法:
绝不打印明文密码/Token。必须调试时,可以做脱敏处理: 复制log.info("Database password: {}***{}", password.substring(0, 2), password.substring(password.length() - 2));1.2.3.误区七:没有密钥轮换与过期机制
有些团队一旦配置好凭证,几年都不改,这会大大增加风险。
正确做法:
定期更换数据库密码、API Key 等。在配置中心统一管理密钥轮换。对 JWT、OAuth2 Token 设置过期时间。建立应急机制:一旦泄露,能立刻切换。实战示例:结合 Jasypt 在 Spring Boot3 中安全解密
在 com.icoderoad.security.config 包下新增一个配置类:
复制package com.icoderoad.security.config; import org.jasypt.encryption.StringEncryptor; import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JasyptConfig { /** * 定义 Jasypt 加密器 * 加密算法可选 PBEWithMD5AndDES、PBEWithHMACSHA512AndAES_256 等 */ @Bean(name = "jasyptStringEncryptor") public StringEncryptor stringEncryptor() { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); // 从环境变量中读取加密密钥,避免写死在配置文件 String password = System.getenv("JASYPT_ENCRYPTOR_PASSWORD"); encryptor.setPassword(password); encryptor.setAlgorithm("PBEWithMD5AndDES"); return encryptor; } }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.在配置文件中使用加密后的密文:
复制spring: datasource: url: jdbc:mysql://localhost:3306/demo username: root password: ENC(1a2b3c4d5e6f)1.2.3.4.5.运行时,只需通过环境变量传入 Jasypt 密钥:
复制export JASYPT_ENCRYPTOR_PASSWORD=secretkey java -jar app.jar1.2.这样,源码下载Spring Boot 会自动识别 ENC(...) 的密文并解密,无需手动处理。
结论
配置文件安全,不只是“写不写明文密码”这么简单,而是一整套系统工程。 本文梳理了七大常见误区:
明文存储过度依赖 .gitignoreBase64 伪加密密钥与密文放一起只保护数据库,忽略其他敏感信息日志泄露缺乏轮换机制对应的正确实践包括:
使用环境变量、配置中心来管理敏感信息借助 Jasypt、Vault、KMS 等工具进行真正加密永不打印明文,必要时脱敏建立定期轮换与应急替换机制在 com.icoderoad.security.config 中配置统一的 Jasypt 加密解密工具在 Spring Boot3 的生产实践中,配置文件的安全管理与代码质量同等重要。忽视它,就等于给黑客留了一扇随时可入的后门。 真正做到“密钥可控、凭证可管、日志可审”,才能让你的应用在安全性上立于不败之地。
猜你喜欢
- 本文记录配置Linux服务器的初步流程,也就是系统安装完成后,下一步要做的事情。这主要是我自己的总结和备忘,假如有遗漏,欢迎大家补充。下面的操作针对Debian/Ubuntu系统,其他Linux系统也类似,就是部分命令稍有不同。 第一步:root用户登录 首先,使用root用户登录远程主机(假定IP地址是128.199.209.242)。 ssh root@128.199.209.242这时,命令行会出现警告,表示这是一个新的地址,存在安全风险。键入yes,表示接受。然后,就应该可以顺利登入远程主机。接着,修改root用户的密码。 passwd第二步:新建用户 首先,添加一个用户组(这里假定为admin用户组)。 addgroup admin然后,添加一个新用户(假定为bill)。useradd -d /home/bill -s /bin/bash -m bill 上面命令中,参数d指定用户的主目录,参数s指定用户的shell,参数m表示假如该目录不存在,则创建该目录。接着,设置新用户的密码。 passwd bill 将新用户(bill)添加到用户组(admin)。usermod -a -G admin bill 接着,为新用户设定sudo权限。visudovisudo命令会打开sudo设置文件/etc/sudoers,找到下面这一行。root ALL=(ALL:ALL) ALL在这一行的下面,再添加一行。root ALL=(ALL:ALL) ALLbill ALL=(ALL) NOPASSWD: ALL上面的NOPASSWD表示,切换sudo的时候,不需要输入密码,我喜欢这样比较省事。假如出于安全考虑,也可以强制要求输入密码。root ALL=(ALL:ALL) ALLbill ALL=(ALL:ALL) ALL然后,先退出root用户的登录,再用新用户的身份登录,检查到这一步为止,是否一切正常。exitssh bill@128.199.209.242第三步:SSH设置 首先,确定本机有SSH公钥(一般是文件~/.ssh/id_rsa.pub),假如没有的话,使用ssh-keygen命令生成一个(可参考我写的SSH教程)。 在本机上另开一个shell窗口,将本机的公钥拷贝到服务器的authorized_keys文件。 cat ~/.ssh/id_rsa.pub | ssh bill@128.199.209.242 mkdir -p .ssh && cat - >>~/.ssh/authorized_keys# 或者在服务器端,运行下面命令echo ssh-rsa [your public key] >~/.ssh/authorized_keys然后,进入服务器,编辑SSH配置文件/etc/ssh/sshd_config。sudo cp /etc/ssh/sshd_config ~sudo nano /etc/ssh/sshd_config在配置文件中,将SSH的默认端口22改掉,可以改成从1025到65536之间的任意一个整数(这里假定为25000)。Port 25000然后,检查几个设置是否设成下面这样,确保去除前面的#号。Protocol 2PermitRootLogin noPermitEmptyPasswords noPasswordAuthentication noRSAAuthentication yesPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keysUseDNS no上面主要是禁止root用户登录,以及禁止用密码方式登录。接着,在配置文件的末尾,指定允许登陆的用户。 AllowUsers bill保存后,退出文件编辑。接着,改变authorized_keys文件的权限。 sudo chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh/然后,重启SSHD。sudo service ssh restart# 或者sudo /etc/init.d/ssh restart下面的一步是可选的。在本机~/.ssh文件夹下创建config文件,内容如下。Host s1HostName 128.199.209.242User billPort 25000最后,在本机另开一个shell窗口,测试SSH能否顺利登录。ssh s1第四步:运行环境配置 首先,检查服务器的区域设置。 locale假如结果不是en_US.UTF-8,建议都设成它。sudo locale-gen en_US en_US.UTF-8 en_CA.UTF-8sudo dpkg-reconfigure locales然后,更新软件。sudo apt-get updatesudo apt-get upgrade最后,再根据需要,做一些安全设置,比如搭建防火墙,关闭HTTP、HTTPs、SSH以外的端口,这里就不一一介绍了,谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。
- 盘点十个 GitHub 上的前端高仿项目
- 系统架构设计之数据模型的选型难题
- Go 错误处理新思路?用左侧函数和表达式
- 以康宝吸油烟机的优势和特点剖析(打造健康环保的厨房生活体验)
- 并发场景下数据写入功能的实现
- @Transactional 竟也能解决分布式事务?
- 系统架构设计之数据模型的选型难题
- 电脑复制文件的错误与解决方法(探究电脑文件复制过程中可能出现的错误及应对之策)