简介:java系列技术分享(持续更新中…)
初衷:一起学习、一起进步、坚持不懈
如果文章内容有误与您的想法不一致,欢迎大家在评论区指正
希望这篇文章对你有所帮助,欢迎点赞收藏 ⭐留言

更多文章请点击

文章目录

  • 一、哪些信息要加密呢?
  • 一、如何加密配置项呢?
    • 1. 引入jasypt-spring-boot加密组件
    • 2. 配置加密密钥
    • 3. 加密
    • 4. 修改配置文件,替换待加密配置项
    • 5. 启动,测试
  • 三、疑问” />1. 加密密钥必须放在ENC()中?为什么是ENC?
  • 2. 自定义的加密密钥假如泄露了,不还是有几率解密吗?
    • 2.1 使用自定义加密器
    • 2.2 加密密钥不要写在配置文件中
      • 2.2.1 方式一:直接作为程序启动时的命令行参数来带入
      • 2.2.2 方式二:直接作为程序启动时的应用环境变量来带入
      • 2.2.3 方式三:甚至可以作为系统环境变量的方式来带入
  • 四、加密工具类很多,这里再列举两种
    • 4.1 第一种
    • 4.2 第二种
  • 一、哪些信息要加密呢?

    密码配置项都不加密?想啥呢" />一般来说,项目配置文件里,所有涉及信息安全的配置项都应该做处理,例如:

    • 用到的数据库、缓存的密码
    • 用到的中间件、消息队列的密码
    • 用到的各种第三方服务的Access_Key
    • 其他第三方服务的通信信息
    • …等等

    最起码不能用明文直接写在配置文件里!

    一、如何加密配置项呢?

    1. 引入jasypt-spring-boot加密组件

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

    2. 配置加密密钥

    jasypt:encryptor:password: Encrypt

    jasypt会使用这个自定义加密密钥,对配置文件里的重要项进行加密

    3. 加密

    我们直接扩展Spring Boot项目的启动类,项目启动时执行加密测试代码

    @Componentpublic class SpringBootConfigEncrypt implements CommandLineRunner {@Autowiredprivate ApplicationContext applicationContext;@Autowiredprivate StringEncryptor encryptor;@Overridepublic void run(String... args) throws Exception {Environment environment = applicationContext.getBean(Environment.class);// 首先获取配置文件里的原始明文信息 // 根据自己配置文件中的密码读取路径自行更改String oldPassword = environment.getProperty("spring.datasource.dynamic.datasource.master.password");// 加密String encryptPassword = encrypt( oldPassword );// 打印加密前后的结果对比System.out.println( "MySQL原始明文密码为:" + oldPassword );System.out.println( "====================================" );System.out.println( "MySQL原始明文密码加密后的结果为:" + encryptPassword );}private String encrypt( String originPassord ) {return encryptor.encrypt( originPassord );}private String decrypt( String encryptedPassword ) {return encryptor.decrypt( encryptedPassword );}}

    运行项目,控制台打印:

    4. 修改配置文件,替换待加密配置项

    在代码中使用时,jasypt-spring-boot组件会自动将ENC()语法包裹的配置项加密字段自动解密,数据得以还原。

    5. 启动,测试

    启动正常
    测试数据库查询,从而判断连接是否正常,成功

    三、疑问" />1. 加密密钥必须放在ENC()中?为什么是ENC?

    自定义的前后缀标记,比如我想换成CodeSheep()来标记加密字段,此时只需要在配置文件里配置一下前后缀即可:

    jasypt:encryptor:property:prefix: Code(suffix: )

    同样yml中的也需要更改

    2. 自定义的加密密钥假如泄露了,不还是有几率解密吗?

    自定义加密密钥泄露,那我们的加密字段也还是有可能被别人解密,为此,有几项工作可以让加密变得更加安全

    2.1 使用自定义加密器

    上文实验加密时,使用的是默认的加密规则,这一点会让当自定义加密密钥泄漏时可能变得不安全。为此我们可以自定义加密规则

    @Configurationpublic class CodeSheepEncryptorCfg {@Beanpublic StringEncryptor myEncryptStringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("Encrypt");config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}}

    将加密测试代码的加密器进行修改

    @Autowired注入原理:

    1. 先按照类型进行注入
    2. 如果在Spring容器中存在同一个类型的多个bean,那么此时在进行注入的时候是按照属性名称进行注入

    2.2 加密密钥不要写在配置文件中

    如果觉得上面这种方式还是可能会导致加密密钥泄露的话,可以直接将加密密钥从配置文件中拿掉,有三种方式

    2.2.1 方式一:直接作为程序启动时的命令行参数来带入

    java -jar app.jar --jasypt.encryptor.password=Encrypt

    2.2.2 方式二:直接作为程序启动时的应用环境变量来带入

    java -Djasypt.encryptor.password=Encrypt -jar app.jar

    2.2.3 方式三:甚至可以作为系统环境变量的方式来带入

    登录环境和非登录环境读取配置文件的顺序是不一样的,Shell脚本内容过多,不进行详细介绍,可以在
    Linux Shell编程入门到实战(一)
    Linux Shell编程入门到实战(二)
    中有详细介绍自行学习

    我们提前配置好自定义全局环境变量,则直接在Spring Boot的项目配置文件中做如下配置即可:

    linux中
    1. 编辑/etc/profile全局配置文件

      export JASYPT_ENCRYPTOR_PASSWORD = Encrypt
    2. 重载配置文件/etc/profile, 因为配置文件修改后要立刻加载里面的数据就需要重新加载

      source /etc/profile
    3. yml中

      jasypt:encryptor:password: ${JASYPT_ENCRYPTOR_PASSWORD}

      这时候也安全很多

    四、加密工具类很多,这里再列举两种

    加密工具类非常多,大家可以自行选择
    这里列举其他两种:

    4.1 第一种

    public class JasyptUtil {public static void main(String[] arg) {StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();/*配置文件中配置如下的算法*/standardPBEStringEncryptor.setAlgorithm("PBEWithMD5AndDES");/*配置文件中配置的password*/standardPBEStringEncryptor.setPassword("Encrypt");/*要加密的文本*/String name = standardPBEStringEncryptor.encrypt("root");String password = standardPBEStringEncryptor.encrypt("123456");/*将加密的文本写到配置文件中*/System.out.println("name=" + name);System.out.println("password=" + password);}}

    4.2 第二种

    public class JasyptUtil {public static void main(String[] args) {String account = "root";String password = "123456";BasicTextEncryptor encryptor = new BasicTextEncryptor();//秘钥encryptor.setPassword("Encrypt");//密码进行加密String newAccount = encryptor.encrypt(account);String newPassword = encryptor.encrypt(password);System.out.println("加密后账号:" + newAccount);System.out.println("加密后密码:" + newPassword);}}