文档章节

springboot的配置加密(一)之druid

Mr_Qi
 Mr_Qi
发布于 07/25 21:25
字数 626
阅读 51
收藏 9

背景

不止一次碰到小伙伴询问如下问题 我把数据库密码和用户名写在配置文件里 会不会不安全~

想当然 肯定是不安全的 万一提交了配置文件那么生产环境的用户名和密码不就泄露了么???

倒不是不信任小伙伴 不过由于未隔离造成的事件真是太多了~因此权限需要严格把控 http://news.sina.com.cn/o/2018-06-05/doc-ihcqccin5836273.shtml

分析

一般来说那些数据需要加密呢???

典型的包括db配置 第三方安全key配置等等

关于db配置的加密 其实druid提供了一个简单的密码回调来完成

首先看看druid的解决方案~

public class DruidPasswordCallback extends PasswordCallback {
 
    private static final long serialVersionUID = 1L;
 
    private String            url;
 
    private Properties        properties;
 
    public DruidPasswordCallback(){
        this("druidDataSource password", false);
    }
 
    public DruidPasswordCallback(String prompt, boolean echoOn){
        super(prompt, echoOn);
    }
 
    public String getUrl() {
        return url;
    }
 
    public void setUrl(String url) {
        this.url = url;
    }
 
    public Properties getProperties() {
        return properties;
    }
 
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
 
}

其继承了java的passwordCallback方法

public PhysicalConnectionInfo createPhysicalConnection() throws SQLException {
    String url = this.getUrl();
    Properties connectProperties = getConnectProperties();
 
    
    String password = getPassword();
    PasswordCallback passwordCallback = getPasswordCallback();
 
    if (passwordCallback != null) {
        if (passwordCallback instanceof DruidPasswordCallback) {
            DruidPasswordCallback druidPasswordCallback = (DruidPasswordCallback) passwordCallback;
 
            druidPasswordCallback.setUrl(url);
            druidPasswordCallback.setProperties(connectProperties);
        }
 
        char[] chars = passwordCallback.getPassword();
        if (chars != null) {
            password = new String(chars);
        }
    }
 
    //省略
    return new PhysicalConnectionInfo(conn, connectStartNanos, connectedNanos, initedNanos, validatedNanos);
}

很明显可以看到了password将由getPassword提供。因此我们需要自己继承DruidPasswordCallback完成password的获取

方案

  1. 可以自定义passwordcallback 通过某种服务去获取到密码~
  2. 自定义passwordcallback通过解码获得密码
  3. 其他形式

此时我们选择解密的形式【这样尽量最少依赖】

在配置数据源的时候我们可以配置密码密文为

<property name="connectionProperties" value="password=${db.password}"/>

由于druid在初始化的时候将connectionProperties传递到passwordCallback中 此时在callback中可以利用一些方法完成密码的获得。

那么我们实现一个callback

public class F6carPasswordCallback extends DruidPasswordCallback {
 
    @Override
    public void setProperties(Properties properties) {
        super.setProperties(properties);
        String password = (String) properties.get("password");
        String dbpassword= decrypt(password);
        setPassword(dbpassword.toCharArray());
    }
}

这样就完成了密码的加解密~

 

弊端

和实现进行绑定 并且无法对于其他字段进行加密

 

© 著作权归作者所有

共有 人打赏支持
Mr_Qi

Mr_Qi

粉丝 280
博文 359
码字总数 369228
作品 0
南京
程序员
私信 提问
springboot的配置加密(二)之属性替换法

背景 承接上文 springboot的配置加密(一)之druid 分析 druid的方案虽然不错 不过仅仅只能对与db进行配置 【而且限定了只能对于密码进行加密】对于我们想要加密需求比较多的似乎不太合适~ 那...

Mr_Qi
07/25
0
0
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
04/19
0
0
Spring Boot学习资源

Spring Boot 入门 http://blog.csdn.net/isea533/article/details/50278205 ---------------------------------------------------------- Spring Boot 静态资源处理 http://blog.csdn.net/c......

IamOkay
2017/02/17
0
0
SpringBoot与Mybatis整合的多模块项目

springBoot项目构建 Spring多模块项目的构建 1.使用Idea构建一个Springboot项目 File-->new-->project-->springInitializr-->(NEXT) 2.主项目pom中添加依赖 ~ org.springframework.bootspri......

JavionXiong
06/22
0
0
SpringBoot入门之基于Druid配置Mybatis多数据源

上一篇了解了Druid进行配置连接池的监控和慢sql处理,这篇了解下使用基于基于Druid配置Mybatis多数据源。SpringBoot默认配置数据库连接信息时只需设置url等属性信息就可以了,SpringBoot就会...

社会主义接班人
07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
今天
5
0
java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
23
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
18
0
my.ini

1

architect刘源源
今天
16
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部