SpringCloud框架源码EnvironmentDecryptApplicationInitializer冲突解决

问题描述

配置文件需要配置数据库加密密码,采用RSA加密算法,但是统一需要 加{cipher}{rsa}前缀,不加前缀前启动正常。加了前缀后并且已经在代码里边处理替换掉前缀但是仍然报错:

java.lang.IllegalStateException: Cannot decrypt: key=spring.datasource.sydev.password
	at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:298)
	at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.lambda$decrypt$0(EnvironmentDecryptApplicationInitializer.java:276)
	at java.util.LinkedHashMap.replaceAll(LinkedHashMap.java:694)
	at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:271)
	at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:196)
	at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.initialize(EnvironmentDecryptApplicationInitializer.java:130)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener$DelegatingEnvironmentDecryptApplicationInitializer.initialize(BootstrapApplicationListener.java:441)
	at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626)
	at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:370)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
	at com.ztesoft.SmartServiceApplication.main(SmartServiceApplication.java:38)
Caused by: java.lang.UnsupportedOperationException: No decryption for FailsafeTextEncryptor. Did you configure the keystore correctly?
	at org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration$FailsafeTextEncryptor.decrypt(EncryptionBootstrapConfiguration.java:165)
	at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:283)
	... 10 common frames omitted

解决办法

查看bug提示的EnvironmentDecryptApplicationInitializer源码,发现他是springcloud内置的加密解密方法,打断点定位到如下方法:

于是查看ENCRYPTED_PROPERTY_PREFIX:

what?

刚好跟配置文件的配置密码前缀冲突,所以思路是重写下改类,重写的方式时包路径形同,记住需要启动的服务都需要重写一遍,因为这个是springcloud里边的,类加载在自己服务之前,所以你自己只在代码截取还不能起作用,都还没类加载到你代码就崩了

第一步:

在需要启动服务的的java文件夹下服务重写下类,新建下包和class:

第二步:

修改源码的ENCRYPTED_PROPERTY_PREFIX为其他任意值,尽量复杂一点避免以后冲突:

第二步:重写下源码的decrypt方法,替换下前缀

    private void decrypt(Map<String, Object> properties) {
        properties.replaceAll((key, value) -> {
            String valueString = value.toString();
            if (!valueString.startsWith(ENCRYPTED_PROPERTY_PREFIX)) {
                return valueString.replace(RSA_PRE_FIX, "");
            }
            return decrypt(key, valueString);
        });
    }

第三步:在自己代码逻辑里边,调用加密方法的地方替换下前缀,......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值