spring boot中关于配置文件中,数据库密码需要RSA加密的功能

最近做项目,客户要求,所有的配置文件中,不能出现明文密码,必须要使用 RSA 2048加密。在这里,记录一下,怎么实现这个功能的。

主要是用springboot暴露的EnvironmentPostProcessor扩展接口。

     首先我们新建一个类来实现这个扩展接口,用来把配置文件中加密的数据库密码,进行解密,然后将明文密码,替换到spring的参数中去。

@Slf4j
public class SaftEncryptProcessor implements EnvironmentPostProcessor{

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        boolean flag = false;
        for(PropertySource<?>  ps : environment.getPropertySources()){
            if(ps instanceof OriginTrackedMapPropertySource){
                Map<String,Object> map = new HashMap<>();
                OriginTrackedMapPropertySource source = (OriginTrackedMapPropertySource)ps;
                try{
                    for(String name : source.getPropertyNames()){
                        Object value = source.getProperty(name);
                        map.put(name,value);
                        if(RSADecryptConstants.passWordProperty.equals(name)){
                            String str = (String) value;
                            byte[] resultpass = RSAEncryptDecrypt.decrypt(str,RSADecryptConstants.privateRsaKey);
                            String newpass = new String(resultpass);
                            map.put(name,newpass);
                            flag = true;
                        }

                        if(RSADecryptConstants.redisPassWordProperty.equals(name)){
                            flag = true;
                            String str = (String) value;
                            byte[] resultpass = RSAEncryptDecrypt.decrypt(str,RSADecryptConstants.privateRsaKey);
                            String newpass = new String(resultpass);
                            map.put(name,newpass);
                        }
                    }
                    if(flag){
                        environment.getPropertySources()
                                .addLast(new MapPropertySource(ps.getName(), Collections.unmodifiableMap(map)));
                    }
                }catch (Exception e){
                    throw new RuntimeException("RSA解密出错"+ e);
                }
            }
        }
    }
}

在这个类里面,我们会用 RSAEncryptDecrypt.decrypt(str,RSADecryptConstants.privateRsaKey);

方法来解密。

ps: RSADecryptConstants.privateRsaKey 这个是自己用来解密的私钥,str 就是加密的密文了

     RSADecryptConstants.redisPassWordProperty 这个是spring配置文件中参数的key 比如

     这个就是redis密码的key(spring.redis.password),自己建个常量来记录。

public class RSAEncryptDecrypt {
    public static byte[] decrypt(String str,String privateKey) throws Exception{
        //Base64 解密秘钥
        byte[] prikeydecoded = Base64.getDecoder().decode(privateKey.getBytes());

        RSAPrivateCrtKey prikey = (RSAPrivateCrtKey) KeyFactory.getInstance("RSA")
                .generatePrivate(new PKCS8EncodedKeySpec(prikeydecoded));
        //解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE,prikey);
        return getMaxResultDecrypt(str,cipher);
    }



    private static byte[] getMaxResultDecrypt(String str,Cipher cipher)throws Exception{
        byte[] basestr = Base64.getDecoder().decode(str.getBytes("UTF-8"));
        int inputlength = basestr.length;
        int MAX_ENCRYPT = 256;
        int offset = 0;
        byte [] resultBytes = {};
        byte [] cache = {};
        while(inputlength - offset > 0){
            if(inputlength - offset > MAX_ENCRYPT){
                cache = cipher.doFinal(basestr,offset,MAX_ENCRYPT);
            }else{
                cache = cipher.doFinal(basestr,offset,inputlength - offset);
                offset = inputlength;
            }
            resultBytes = Arrays.copyOf(resultBytes,resultBytes.length+cache.length);
            System.arraycopy(cache,0,resultBytes,resultBytes.length-cache.length,cache.length);
        }
        return resultBytes;
    }
}

ps:不论是秘钥,还是加密密文,都是经过Base64 加密过的,所以都需要先进性Base64解密

     getMaxResultDecrypt 这个方法主要是因为RSA加密,解密都有长度限制,必须分段加密,解密。

到这里就差不多完成了,最后 配置进spring.factories

在resources 下 新建META-INF文件夹并 新建 spring.factories文件,配置org.springframework.boot.env.EnvironmentPostProcessor

org.springframework.boot.env.EnvironmentPostProcessor=com.personal.riskdatabase.config.SaftEncryptProcessor

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值