前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >项目中如何对数据库和redis进行加解密处理?

项目中如何对数据库和redis进行加解密处理?

作者头像
技术从心
发布2019-08-06 16:45:34
4.6K0
发布2019-08-06 16:45:34
举报
文章被收录于专栏:技术从心技术从心

1.需求背景

由于项目的需求要求对数据的账号密码和redis的密码进行加密处理,但又不知道用什么加密的方法,有一些加密的方式很容易破解,正在苦恼的时候问了一下其他的同事只要是加密的不那么一眼看出来就行,心想这是什么心态啊!也是醉了,那既然这样就先按这样做吧!

既然知道只需要加密一下那就好办了那就用base64加密就行了。但是问题又来了项目用的是xml的方式读取配置文件,百度了一下之后发现非常的简单,所以啊百度google真是个好东西啊。

我们在开发应用时,需要连接数据库,一般把数据库信息放在一个属性配置文件中,比如jdbc.properties,具体的内容

代码语言:javascript
复制
#mysql的配置文件
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.username=root
jdbc.password=123456

里面用明文的方式存储着数据库的敏感信息用户名username和密码password,这是不好的行为,容易产生安全问题。那我们如何实现加密存储呢?

2. 实现原理

实现原理其实很简单,配置文件存储加密后的用户名和密码,重写Druid数据源的两个方法setUsername(String username)和setPassword(String password)对信息解密。

3. 实现方式

3.1 写加密工具

首先得有一个加密工具,具有加解密功能,这里为了方便直接使用Druid中的工具类com.alibaba.druid.filter.config.ConfigTools。使用其中的encrypt(String plainText)方法和decrypt(String cipherText)方法采用默认的公私玥加解密。

3.2 加密配置文件
代码语言:javascript
复制
#MySql数据库配置
connection.url=jdbc:mysql://127.0.0.1:3306/test
connection.username=*************加密后的用户名********************
connection.password=*************加密后的密码**********************

3.3 创建自己的数据源

新建类SecurityDateSource继承数据源DruidDataSource并重写其中设置用户名和密码的方法:

代码语言:javascript
复制
import com.alibaba.druid.filter.config.ConfigTools;
import com.alibaba.druid.pool.DruidDataSource;

public class SecurityDateSource extends DruidDataSource{
    @Override
    public void setUsername(String username) {
        try {
            username = ConfigTools.decrypt(username);
        } catch (Exception e) {
            e.printStackTrace();
        }
       //调用父类中的setUname()方法设置加密后的值进去
        super.setUsername(username);
    }

    @Override
    public void setPassword(String password) {
        try {
            password = ConfigTools.decrypt(password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //调用父类中的setPassword()方法设置加密后的值进去
        super.setPassword(password);
    }

    public static void main(String[] args) throws Exception{
        String password = "123456";
        String username = "root";
        System.out.println("加密后的password = [" + ConfigTools.encrypt(password) + "]");
        System.out.println("加密后的username = [" + ConfigTools.encrypt(username) + "]");
    }
}

3.4 Spring文件中配置数据源

注意将class改为自己的新建的数据源

代码语言:javascript
复制
<bean id="dataSource" class="com.wei.core.database.SecurityDateSource" init-method="init" destroy-method="close">
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

4.第二种当时

使用druid加密的第二种方法

代码语言:javascript
复制
<!-- 开启Druid的监控统计功能 -->

<property name="filters" value="config" />

<!-- 开启数据库密码解密-->

<property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${publickey}" />
4.1.配置文件config.properties中,添加此行代码
代码语言:javascript
复制
publickey=${jdbc.mysql.publickey}

主要作用是对应加密后的公钥。

4.2.修改pom.xml文件,添加此两行代码。

代码:

代码语言:javascript
复制
<jdbc.mysql.publickey></jdbc.mysql.publickey>
4.3.以上配置好后,使用durid的加密算法生成加密密码和公钥。

首先要找到jar包所在位置,然后shift+右键,点击 在此处打开命令窗口,然后输入:

代码语言:javascript
复制
java -cp druid-1.0.18.jar com.alibaba.druid.filter.config.ConfigTools 1234567a

(druid-1.0.18.jar:对应的jar包名称,12345678a:对应的数据库密码)按回车

代码语言:javascript
复制
privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEA3MAoIF9F/wDJneKskSBJ9VE8VFeeShJyAaHM9I7LphSDvf8xxLAv2LcP+t1LHMa/yElVDr4cyFv5azWxKOwjxwIDAQABAkEAwIpx9VpkKPk84ZM2RRbOq0QBxObvT1grTDUeGSj7g4y+ZH+I+DHnJdzHrYWWTJ2Hx3evesp+iVUy8Ni/dvkUEQIhAPGL+df7YqaiL5lSgFqNNkrnw0/8j6v4GxSkofG2jGMFAiEA6fWfyil8+aa5j+NgA0MZYWQfRRNa2jz3PTClttTV/VsCIELkFaN3TWGCBpZ6H2t0MbXaqt7qvUrNYYp88RAEEqqVAiBZ99yUr1Oh5V1iWbuoRXtTGl9z/rdnSR6CZ1yybDJGFQIgYkRZkoMq1sJ7b/Jlh4Prp7ntzzmmkpu9rogB4iE9p24=

privateKey:私钥,用于生成密文密码用,不用管

代码语言:javascript
复制
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANzAKCBfRf8AyZ3irJEgSfVRPFRXnkoScgGhzPSOy6YUg73/McSwL9i3D/rdSxzGv8hJVQ6+HMhb+Ws1sSjsI8cCAwEAAQ==

publicKey:就是步骤4中publickey中的值,用于解密密码

代码语言:javascript
复制
password:HRDx+yN+mqk7hNAzZQ8M4wkV7hKgjE3XIAP1/gvjjwx8ZFrWmEvVfmDwQkyB3qasffxZhFrxOmUuDPIIVkFDnQ==

paasword:加密后的密码 将生成publicKey和password分别放入步骤4中,password2和publickey中。 配置完成。

4.4.备注:

1. 每次使用jar包生成加密密码时都会出现新的加密信息,但是之前生成的加密信息扔可用,所以每次只生成一次即可。

2. 将publickey和password都放在pom.xml中时,如果更改pom中配置的key时,需要重新使用maven命令clean后再打包,不然会连接失败。

3. 或者修改配置,pom中只有加密后的password,不放publickey,将公钥放入config.properties中,如图

5.redis密码加密处理

使用base64加密这个加密的工具类网上很多 然后再读取配置中的密码解密

代码语言:javascript
复制
package com.cpic.caf.compon.util;

import redis.clients.jedis.JedisPoolConfig;

import com.cpic.caf.core.utils.RedisClusterUtil;
import com.cpic.caf.template.home.util.Base64Strategy;

/**
 * @author 作者 :lyj
 * @version 创建时间:2019年5月5日 下午5:04:16
 * 对加密后redis密码解密
 */
public class SecurityRedis extends RedisClusterUtil{

    /**
     * 修改父类中password的设值
     * @param redisUris
     * @param jedisPoolConfig
     * @param password
     * @param connectionTimeout
     * @throws Exception
     */
    public SecurityRedis(String redisUris,JedisPoolConfig jedisPoolConfig,String password,int connectionTimeout) throws Exception {
            //调用父类中的方法将解密后的密传入进去
        super(redisUris, jedisPoolConfig, Base64Strategy.decode(password), connectionTimeout);
    }

}

引用自己写的继承父类的类

这样就可以达到对加密后的redis密码进行解密了。

在看、转发和辣条会提升颜值哦~

关注我

每天进步一点点

万水千山总是情,点个 “在看” 行不行

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.需求背景
  • 2. 实现原理
  • 3. 实现方式
    • 3.1 写加密工具
      • 3.2 加密配置文件
      • 3.3 创建自己的数据源
      • 3.4 Spring文件中配置数据源
      • 4.第二种当时
        • 4.1.配置文件config.properties中,添加此行代码
          • 4.2.修改pom.xml文件,添加此两行代码。
            • 4.3.以上配置好后,使用durid的加密算法生成加密密码和公钥。
              • 4.4.备注:
              • 5.redis密码加密处理
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档