天呐,你生产环境中的密码还在裸奔吗?

点击上方蓝色“大数据实战演练”,选择“设为星标”或“置顶”

回复“资源”领取独家整理的学习资料!

每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~

 1 

先看一份典型的配置文件

.. 省略 ...

## 配置MySQL数据库连接
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.xx.xxx:3306/test?createDatabaseIfNotExist=true&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
    username: root
    password: 123456

... 省略 ...

这是节选自某个典型的 Spring Boot 项目的 application.yml 配置文件。

嘘... 偷偷告诉我,是不是很多小伙伴也都是这么写的?

这乍一看没啥问题,很多人会觉得理所当然。包括我自己也看到过很多的项目(包括很多开源项目)是这么写的。

但仔细一琢磨,发现里面有明文密码呀,这是不是就很危险?!尤其你的项目要是上传到 github 公共库的话,是可以被任何人查阅的,如果这样导致自己或公司的数据库泄露,后果可想而知。。。

总而言之,在配置文件中的所有密码都应该做加密处理。今天我们就来讲一下加密组件 Jasypt 这个强大的库。

 2 

引入依赖

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.1.0</version>
</dependency>

 3 

配置加密相关参数

方式一:使用 properties 文件配置

jasypt.encryptor.algorithm=PBEWithMD5AndDES   # 默认的加密方式,还可以是PBEWithMD5AndTripleDES
jasypt.encryptor.password=jasypt   # 加解密所需的salt(盐)
jasypt.encryptor.property.prefix=ENC(   # 标记密文的前缀
jasypt.encryptor.property.suffix=)    # 标记密文的后缀

方式二:使用 yml 文件配置

jasypt:
  encryptor:
    password: jasypt
    algorithm: PBEWithMD5AndDES
    property: 
        prefix: ENC(
        suffix: )

方式三:使用启动参数配置(为了防止salt(盐)泄露,反解出密码。可以在项目部署的时候作为参数传入salt(盐)值,推荐使用

1)idea 配置方法

2)启动 jar 包命令:

java -Djasypt.encryptor.password=jasypt -jar xxx.jar

上面的 jasypt.encryptor.password 配置是指定 jasypt 加解密明文的密钥。即:jasypt 会根据该值加密你的明文,然后你将密文配置在配置文件中显示;程序启动的时候,jasypt 会将你的密文根据密钥解密,进行验证。

 4 

两种生成密文的方式

方式一:使用 spring boot 单元测试

import org.jasypt.encryption.StringEncryptor;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JasyptTest {

    @Autowired
    private StringEncryptor stringEncryptor;

    @Test
    public void encryptPwd() {
        //加密123456
        String result = stringEncryptor.encrypt("123456");
        System.out.println(result);
    }
}

在单元测试中,spring boot 会读取 application 配置文件中的 jasypt.encryptor.password ,对明文 123456 进行加密。

方式二:使用工具类

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;

/**
* Jasypt加密工具类
*/
public class JasyptUtil {

    /**
     * Jasypt生成加密结果
     * @param password 配置文件中设定的加密密
     * @param value 加密值
     * @return
     */
    public static String encyptPwd(String password,String value){
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(cryptor(password));
        String result = encryptor.encrypt(value);
        return result;
    }

    /**
     * 解密
     * @param password 配置文件中设定的加密密码
     * @param value 解密密文
     * @return
     */
    public static String decyptPwd(String password,String value){
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(cryptor(password));
        String result = encryptor.decrypt(value);
        return result;
    }

    public static SimpleStringPBEConfig cryptor(String password){
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        return config;
    }

    public static void main(String[] args){
        //加密
        System.out.println(encyptPwd("jasypt","123456"));
        //解密
        System.out.println(decyptPwd("jasypt","lnzpDZItgjAntHqsYPFTew=="));
    }
}

 5 

配置密文

将生成的加密密文配置在配置文件中即可,如示例所示,密文已用 test() 所标记,在启动时会解析所有 jasypt.encryptor.property.prefix/suffix 标记的密文。

示例:

jasypt:
  encryptor:
    password: jasypt
    algorithm: PBEWithMD5AndDES
    property: 
        prefix: test(
        suffix: )spring:
  datasource:
    password: test(lnzpDZItgjAntHqsYPFTew==)

 6 

嘘... 快去加密

好了,说了这么多,如果你项目的配置文件中的重要信息没有加密的话,答应我,二话别说,赶快全部偷偷去改掉,快!速度!跑步前进!


有什么想说的,来讨论

???? ???? ????

往期推荐

入群指南(大数据实战演练群分布情况)

(内部资料)Ambari 自定义服务第八讲:添加自定义告警

如何优雅地使用 java 连接 HBase 客户端

悄悄掌握 Kafka 常用命令,再也不用全网搜索了(建议收藏)

Spring bean 加载顺序导致的 bug 问题

继续更新两讲 | Ambari自定义服务集成视频系列

扫一扫,我们的故事就开始了。

如果这篇文章对你有所启发,点赞、转发都是一种支持!

另外公众号改变了推送规则,大家看文章不要忘记点击最下方的在看,点赞按钮,这样微信自动识别为常看公众号,否则很可能推送的文章可能淹没在别的文章找不到,谢谢大家

让我知道你在看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

create17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值