SpringBoot配置文件敏感字段加密

时间:2020-11-15 08:16:02   收藏:0   阅读:238

一、Jasypt是什么

官网:http://www.jasypt.org/

Jasypt是一个Java库,允许开发人员以很简单的方式添加基本加密功能,而无需深入研究加密原理。利用它可以实现高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件。

  1. 高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件…
  2. 集成Hibernate的。
  3. 可集成到Spring应用程序中,与Spring Security集成。
  4. 集成的能力,用于加密的应用程序(即数据源)的配置。
  5. 特定功能的高性能加密的multi-processor/multi-core系统。
  6. 与任何JCE(Java Cryptography Extension)提供者使用开放的API

技术分享图片

说了这么多,我们spring boot 配置管理到底用Jasypt做什么?

二、生成加密串

脚本生成加密串

为了方便,简单编写了一个bat脚本方便使用。

@echo off
set/p input=待加密的明文字符串:
set/p password=加密密钥(盐值):
echo 加密中......
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI  ^
input=%input% password=%password% ^
algorithm=PBEWithMD5AndDES
pause

注意:jasypt-1.9.2.jar 文件需要和bat脚本放在相同目录下。此包可直接在示例项目中直接下载。

使用示例,双击上面的bat脚本文件,输入待加密内容和密钥,得到加密结果:

技术分享图片

注意:相同的盐值(密钥),每次加密的结果是不同的。

工具类生成加密串

    /**
     * 对family.father.name进行加密
     */
    @Test
    public void tes4(){
        //加密解密对象:默认是被springboot集成过来了,引入包就可以用。
        BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();
        //加密所需的salt(盐)
        basicTextEncryptor.setPassword("123456");
        //对family.father.name进行加密
        String s = basicTextEncryptor.encrypt("happy family");
        System.out.println(s);
    }

    /**
     * 对family.father.name进行加密
     */

    @Test
    public void tes5(){
        //加密工具
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        //加密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm("PBEWithMD5AndDES");//加密方式,默认PBEWithMD5AndDES,可改PBEWithMD5AndTripleDES
        config.setPassword("123456");//加密所需的salt(盐)
        //应用配置
        encryptor.setConfig(config);

        //对family.father.name进行加密
        String s = encryptor.encrypt("zhoujinyuan");
        System.out.println(s);  //4R6l0dB4vAQtqmKO1L1Ywpl6YIsVKAwP

    }

三、Jasypt与spring boot整合

首先引入Jasypt的maven坐标

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

在properties或yml文件中需要对明文进行加密的地方使用ENC()包裹,如原值:"happy family",加密后使用ENC(密文)替换。程序中像往常一样使用@Value("${}")获取该配置即可,获取的是解密之后的明文值。

技术分享图片

文本被加密之后,我们需要告知Spring Boot该如何解密,因为Spring Boot要读取该配置的明文内容。在application.properties或yml文件中,做如下配置:

# 设置盐值(加密解密密钥),我们配置在这里只是为了测试方便
# 生产环境中,切记不要这样直接进行设置,可通过环境变量、命令行等形式进行设置。下文会讲
jasypt:
  encryptor:
    password: 123456

开始按照老师的测试的时候报错了

EncryptionOperationNotPossibleException

代码没问题

后来发现引入的Jasypt包的版本和我的SpringBoot2.4.0最新版冲突

把Jasypt改成了2.1.1就可以用了

四、“密钥”与配置文件分开存放

本身加解密过程都是通过盐值进行处理的,所以正常情况下盐值加密串是分开存储的。出于安全考量,盐值应该放在系统属性命令行或是环境变量来使用,而不是放在同一个配置文件里面。

4.1 命令行存储方式示例

java -jar xxx.jar --jasypt.encryptor.password=xxx &;

4.2 环境变量存储方式示例

设置环境变量(linux):

# 打开/etc/profile文件
vim /etc/profile
# 文件末尾插入
export JASYPT_PASSWORD = xxxx

启动命令:

java -jar xxx.jar --jasypt.encryptor.password=${JASYPT_PASSWORD} &;

五、这样真的安全么?

有的同学会问这样的问题:如果的linux主机被攻陷了怎么办,黑客不就知道了密钥?

对于这个问题:我只能这么说,如果你的应用从内部被攻陷,在这个世界上没有一种加密方法是绝对安全的。这种加密方法只能做到:防君子不防小人。大家可能都听说过,某著名互联网公司将明文数据库密码上传到了github上面,导致用户信息被泄露的问题。这种加密方式,无非是将密钥与加密结果分开存放,减少个人疏忽导致的意外,增加破解难度。

如果密钥被从内部渗透暴露了,任何加密都是不安全的。就像你的组织内部有离心离德的人,无论你如何加密都不安全,你需要做的是把他找出来干掉,或者防范他加入你的组织!

原文:https://www.cnblogs.com/jinyuanya/p/13975457.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!