@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {MutablePropertySources propertySources = environment.getPropertySources();for (PropertySource<?> propertySource : propertySources) {if (propertySource instanceof OriginTrackedMapPropertySource) {OriginTrackedMapPropertySource om = (OriginTrackedMapPropertySource) propertySource;Map<String, Object> source = om.getSource();source.forEach((k, v) -> {String property = environment.getProperty(k);if (hasPreAndSuf(property)) {LOG.info("开始处理 k = [{}]", k);try {String relay = splitPreAndSuf(property, this.prefix, this.suffix);String decrypt = RSAEncrypt.decrypt(relay, getPrivateKey(environment));source.put(k, decrypt);}catch (Exception e) {LOG.error("e = ", e);}}});}}}处理逻辑如下:
- 提取环境配置中的所有配置属性
- 判断配置属性是否是OriginTrackedMapPropertySource类型 , 该类型的数据是在application.yaml中的内容
- 处理OriginTrackedMapPropertySource对象的value值 , 如果value包含自定义前缀后缀则进行解密
属性含义
默认值
encryption.prefix
前缀
PWD[
encryption.suffix
后缀
]
encryption.rsa.publicKey
公钥
encryption.rsa.privateKey
私钥
注意:**为了便捷操作开放了配置文件形式的公钥秘钥的配置 , 这部分配置可以在测试环境中开发环境中进行使用 。**如果需要在生产环境中使用请使用下面两种方式:
方式一:在项目资源目录resources文件夹下创建hf_private_key文件 , 向文件中填写如下内容
encryption.rsa.privateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIE6SSS+Ns5DpRMKjxThtEL8RwS3HPyFoeDqW54zc0Fsfd4hPuR/BAU6qPWHWo8ZxA17Kfi/HMxYEArNJB6GOpUEvv/wY3sRntMRpS5Y77yqy5mc52vO1fts0oAKeSz5J6Wa1utucUpQwCrZzaZLSjVXqLDJHElgsZocZefPgpKTAgMBAAECgYAFaCDjTqoQWzgu4cQ2xXK7Ur7N7bNixVyOgn+u0MxDsnxZrN5qxP2wElI7Y5xgXF2diseoxqY3zn9tVEPsmwUcY73naoosx9V8oExgT/BUkZYIzj1ei08zOr984zl3dbFcxOCRvqywXj9FAAGx1mhmCzFCIauJg3aX0S9mt5/CwQJBAMYZsmMQ9owoXZuSclKVRfMHFpAPhQlcBM4xadhX0IRYATgNTxpESmcCoGWvyw3bvieNJyC9Njx6X4FJ2EZUzhECQQCm/2IM5MlsCwyKtME5RPFna2hSqYU80UzkNfDIyMokcU2JUI4Fhigog4ol0GFMiMBsHIjS+cJiAwNbIsq5rsJjAkA94yVBobkETFACHBwvBIdXxy0bUF3lcKPnrrQ8bCKuVbf7xNyjfhYoXD+zxNmQuMeNH6HLrpDVD/3qLCGuxyuhAkAiLPl/8gJWnhw+9qbkdXuB0rVS1WZy/9JgkblpHc5gjt9zTo0CDGaDhAftnSuMYiAe/+fwZTSmoj85k3ExdtZJAkEArJuG/NWY9HP4p7jtZX9rMokyB3517v7HQdJKBDIlOzseRC/roCvU8LQ/URDFBUqXCRgedxgW+0ZmKFf4xeawqw==需要将等于号后面的内容进行修改,替换为项目中的秘钥方式二:通过命令行进行传递
在启动命令中添加
-Dencryption.rsa.privateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIE6SSS+Ns5DpRMKjxThtEL8RwS3HPyFoeDqW54zc0Fsfd4hPuR/BAU6qPWHWo8ZxA17Kfi/HMxYEArNJB6GOpUEvv/wY3sRntMRpS5Y77yqy5mc52vO1fts0oAKeSz5J6Wa1utucUpQwCrZzaZLSjVXqLDJHElgsZocZefPgpKTAgMBAAECgYAFaCDjTqoQWzgu4cQ2xXK7Ur7N7bNixVyOgn+u0MxDsnxZrN5qxP2wElI7Y5xgXF2diseoxqY3zn9tVEPsmwUcY73naoosx9V8oExgT/BUkZYIzj1ei08zOr984zl3dbFcxOCRvqywXj9FAAGx1mhmCzFCIauJg3aX0S9mt5/CwQJBAMYZsmMQ9owoXZuSclKVRfMHFpAPhQlcBM4xadhX0IRYATgNTxpESmcCoGWvyw3bvieNJyC9Njx6X4FJ2EZUzhECQQCm/2IM5MlsCwyKtME5RPFna2hSqYU80UzkNfDIyMokcU2JUI4Fhigog4ol0GFMiMBsHIjS+cJiAwNbIsq5rsJjAkA94yVBobkETFACHBwvBIdXxy0bUF3lcKPnrrQ8bCKuVbf7xNyjfhYoXD+zxNmQuMeNH6HLrpDVD/3qLCGuxyuhAkAiLPl/8gJWnhw+9qbkdXuB0rVS1WZy/9JgkblpHc5gjt9zTo0CDGaDhAftnSuMYiAe/+fwZTSmoj85k3ExdtZJAkEArJuG/NWY9HP4p7jtZX9rMokyB3517v7HQdJKBDIlOzseRC/roCvU8LQ/URDFBUqXCRgedxgW+0ZmKFf4xeawqw==需要将等号后面的内容进行修改 , 替换为项目中的秘钥从笔者所经历的角度来看命令行传递参数可能更加安全一些 , 因为文件和命令行相比命令行需要在生产环境才可以看到 , 而文件在仓库中会存在 。
接下来做一个测试 , 在启动时输出spring.datasource.password属性查看是否是加密前的数据 , 测试代码如下:
@SpringBootApplicationpublic class App {@Value("${spring.datasource.password}")private String dataSourceProperties;public static void main(String[] args) {SpringApplication.run(App.class, args);}@Beanpublic ApplicationRunner runner() {return args -> {System.out.println(dataSourceProperties);};}}启动项目后可以看到控制台输出1234qwer原文链接:如果觉得本文对你有帮助 , 可以转发关注支持一下
https://my.oschina.net/huifer/blog/4990480
推荐阅读
- CentOS7下yum方式安装MySQL5.7数据库
- Redis宕机或者出现意外删库导致数据丢失--解决方案
- Springboot +Mybatis实现多数据源配置,你会吗?
- 什么是数据库的“缓存池”?
- Apache四个大型开源数据和数据湖系统
- CentOS 静默安装Oracle
- 一次几乎不可能的数据库迁移
- SpringBoot+Mysql做登陆接口,抛弃mapper.xml
- MySQL数据迁移到TiDB的流程及为何放弃MyCat
- PHP中操作数据库的预处理语句
