Springboot实现ENC加密

这篇具有很好参考价值的文章主要介绍了Springboot实现ENC加密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 为什么要用ENC加密

以下是未经过加密的数据库配置,密码均是采用明文密码,很容易导致数据库泄露。

spring:
 datasource:
  dynamic:
	postgresql:
	 url: jdbc:postgresql://127.0.0.1:5589/mypg?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai
	 username: root
	 password: admin          
	 driver-class-name: org.postgresql.Driver 

...

redis:
 ip: www.xxxx.top
 port: 6379
 # 密码
 pass: admin	
 # 最大实例
 max-total: 1024
 # 最大空闲实例
 max-idle: 100
 # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
 max-wait: 10000
 # 超时时间,单位毫秒。
 timeout: 10000

以下是经过ENC加密之后的配置,这样之后,数据库密码安全级别就高了。

spring:
 datasource:
  dynamic:
	postgresql:
	 url: jdbc:postgresql://127.0.0.1:5589/mypg?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai
	 username: root
	 password: ENC(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q)
	 driver-class-name: org.postgresql.Driver 

...

redis:
 ip: www.xxxx.top
 port: 6379
 # 密码
 pass: ENC(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q)	
 # 最大实例
 max-total: 1024
 # 最大空闲实例
 max-idle: 100
 # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
 max-wait: 10000
 # 超时时间,单位毫秒。
 timeout: 10000

2. jasypt实现ENC加密

1. 实现流程

  • 导入依赖:

            <!-- 配置文件加密 -->
            <dependency>
                <groupId>com.github.ulisesbocchio</groupId>
                <artifactId>jasypt-spring-boot-starter</artifactId>
                <version>3.0.2</version>
            </dependency>
    
  • 测试类:

    import org.jasypt.encryption.StringEncryptor;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.annotation.Resource;
    
    /**
     * @Author: chenJY
     * @Description:
     * @Date: 2022-11-18 9:19
     */
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class EncryptorTest {
        @Resource
        private StringEncryptor jasyptStringEncryptor;
    
        @Test
        public void encode() {
            System.out.println( "加密密文:" + jasyptStringEncryptor.encrypt("admin") );
            System.out.println("解密密文:" + jasyptStringEncryptor.decrypt(jasyptStringEncryptor.encrypt("admin")));
        }
    }
    
  • 运行测试类:
    Springboot实现ENC加密

注意: 每次运行测试类输出的加密密码都不同,但不影响其解密密文。

  • 将加密密文加入到配置文件中:
    spring:
     datasource:
      dynamic:
    	postgresql:
    	 url: jdbc:postgresql://127.0.0.1:5589/mypg?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai
    	 username: root
    	 password: ENC(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q)
    	 driver-class-name: org.postgresql.Driver 
    
    ...
    
    redis:
     ip: www.xxxx.top
     port: 6379
     # 密码
     pass: ENC(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q)
     # 最大实例
     max-total: 1024
     # 最大空闲实例
     max-idle: 100
     # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
     max-wait: 10000
     # 超时时间,单位毫秒。
     timeout: 10000
    
  • 重启springboot项目,能正常启动

2. 说明

由于springboot自动配置的特性,导入 jasypt-spring-boot 依赖包之后,不用进行过多配置,就能实现配置文件加密字段自动解密,所以特别方便。

1. 自定义加密秘钥

1. 盐、前缀、后缀

可以在配置文件中自定义一个加密秘钥(盐), 来获取明文密码。

# 加密秘钥
jasypt:
  encryptor:
    password: Chen # 加密时的salt值
Springboot实现ENC加密

自定义加密前缀、后缀: 如果不想使用 ENC来作为加密前缀,那么可以通过配置文件修改:

# 加密秘钥
jasypt:
  encryptor:
    password: Chen
    property:
      prefix: Chen( # 前缀
      suffix: )chen # 后缀

那么,密码的格式如下:

password: Chen(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q)chen
2. 自定义加密方案

配置类

@Configuration
public class MyEncryptorCfg {
    /**
     * @Description 自定义的加密器配置
     * @author chenJY
     * @date 2022/11/18 9:52
     * @return StringEncryptor
    */
    @Bean(name = "myStringEncryptor")
    public StringEncryptor myStringEncryptor() {

        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();

        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("Chen");
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);

        return encryptor;
    }
}
  • 注意1: bean必须重命名,bean默认名是 jasyptStringEncryptor,当我们要自定义加密方案的时候,就必须重命名。

  • 注意2: 需要在配置文件中加入如下配置:

    jasypt:
      encryptor:
        bean: myStringEncryptor
    

    并修改测试类:

        @Autowired
        private StringEncryptor myStringEncryptor;
    

2. 部署方案

密钥(盐值)存储说明: 本身加解密过程都是通过盐值进行处理的,所以正常情况下盐值和加密串是分开存储的。盐值应该放在系统属性、命令行或是环境变量来使用,而不是放在配置文件。

  • 程序启动 命令行参数:

    java -jar xxx.jar --jasypt.encryptor.password=Chen &
    
  • 程序启动 环境变量:

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

3. 输出密文的几种方案

优化1.: 上面的写法是直接写死了需要加密的密码,我们可以换一种在配置文件中读取数据库密码的写法,如下:

	import org.jasypt.encryption.StringEncryptor;
	import org.junit.Test;
	import org.junit.runner.RunWith;
	import org.springframework.boot.test.context.SpringBootTest;
	import org.springframework.test.context.junit4.SpringRunner;
	
	import javax.annotation.Resource;
	
	/**
	 * @Author: chenJY
	 * @Description:
	 * @Date: 2022-11-18 9:19
	 */
	@SpringBootTest
	@RunWith(SpringRunner.class)
	public class EncryptorTest {
		@Resource
    	private ApplicationContext applicationContext;

	    @Resource
	    private StringEncryptor jasyptStringEncryptor;
	
	    @Test
	    public void encode() {
	        Environment environment = applicationContext.getEnvironment();
        	String password = environment.getProperty("spring.datasource.dynamic.postgresql.password");
	        System.out.println( "加密密文:" + jasyptStringEncryptor.encrypt(password) );
	        System.out.println("解密密文:" + jasyptStringEncryptor.decrypt(jasyptStringEncryptor.encrypt(password)));
	    }
	}

优化2: 重写启动类的run(),实现每次启动项目都会输出一次加密密文文章来源地址https://www.toymoban.com/news/detail-469427.html

import org.jasypt.encryption.StringEncryptor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;

@SpringBootApplication
public class TestDemoApplication implements CommandLineRunner{

    @Resource
    private ApplicationContext applicationContext;

    @Resource
    private StringEncryptor jasyptStringEncryptor;

    public static void main(String[] args) {
        SpringApplication.run(TestDemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Environment environment = applicationContext.getEnvironment();
        String pwd = environment.getProperty("spring.datasource.dynamic.postgresql.password");
        // 打印解密后的结果
        System.out.println( "加密密文:" + jasyptStringEncryptor.encrypt(pwd) );
    }
}

到了这里,关于Springboot实现ENC加密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 低代码是什么意思?企业为什么要用低代码平台?

    低代码是什么意思?企业为什么要用低代码平台? 这两个问题似乎困扰了很多人,总有粉丝跟小简抱怨, 一天到晚念叨低代码,倒是来个人解释清楚啊! 来了,这次一文让你全明白。 在此之前,先了解什么是云计算。 “云” :指的就是互联网,因为之前互联网(Internet)

    2024年02月07日
    浏览(43)
  • 2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?

    2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline? 答案2023-06-03: Redis客户端执行一条命令通常包括以下四个阶段: 1.发送命令:客户端将要执行的命令发送到Redis服务器。 2.命令排队:Redis服务器将收到的命令放入队列中,按照先进先出(FIFO)的原则等待执行。 3.命令

    2024年02月07日
    浏览(33)
  • 在Vue中动态引入图片为什么要用require

    静态资源和动态资源 静态资源 动态的添加src 动态资源 我们通过网络请求从后端获取的资源 动态的添加src会被当成静态资源 动态的添加src最终会被打包成: 动态的添加图片最会会被编译成一个静态的字符串,然后再浏览器运行中会去项目中查找这个资源, 静态资源编译 默

    2024年02月13日
    浏览(41)
  • bash脚本if语句比较为什么要用x

    如下进行PCIe设备的检测和计数,并执行重启操作的例子代码: 在给定的代码片段中,使用 x 是为了避免在比较时出现空字符串的问题。这是一种常见的技巧,用于确保比较操作的准确性。 在这个特定的语句中, x${devIDFunc0} 是用来检查变量 devIDFunc0 是否为空字符串。通过在变

    2024年02月08日
    浏览(43)
  • 为什么爬虫要用高匿代理IP?高匿代理IP有什么优点

    只要搜代理IP,度娘就能给我们跳出很多品牌的推广,比如我们青果网路的。 正如你所看到的,我们厂商很多宣传用词都会用到高匿这2字。 这是为什么呢?高匿IP有那么重要吗? 这就需要我们从HTTP代理应用最多最广的:爬虫数据采集来说。 爬虫数据采集的时候,非常容易遇

    2024年02月12日
    浏览(40)
  • facebook多账号运营为什么要用静态住宅ip代理?

    在进行Facebook群控时,ip地址的管理是非常重要的,因为Facebook通常会检测ip地址的使用情况,如果发现有异常的使用行为,比如从同一个ip地址频繁进行登录、发布内容或者在短时间内进行大量的活动等等,就会视为垃圾邮件或者恶意行为,导致账户被禁用或者限制。 因此,

    2024年02月21日
    浏览(37)
  • 模型\视图一般步骤:为什么经常要用“选择模型”QItemSelectionModel?

                                                              一、“使用视图”一般的步骤: //1. 创建  模型(这里是数据模型!) tabModel = new QSqlTableModel ( this , DB ); // 数据表 //2. 设置  视图 的 模型(这里是数据模型!) ui - tableView - setModel ( tabModel ); 模

    2024年01月22日
    浏览(43)
  • 机器学习分类,损失函数中为什么要用Log,机器学习的应用

    目录 损失函数中为什么要用Log 为什么对数可以将乘法转化为加法? 机器学习(Machine Learning) 机器学习的分类 监督学习 无监督学习 强化学习 机器学习的应用 应用举例:猫狗分类 1. 现实问题抽象为数学问题 2. 数据准备 3. 选择模型 4. 模型训练及评估 5.预测结果 推荐阅读

    2024年02月11日
    浏览(30)
  • 为什么3D开发要用三维模型格式转换工具HOOPS Exchange?

    在当今数字化时代,3D技术在各个行业中扮演着愈发重要的角色,从产品设计到制造、建筑、医疗保健等领域。然而,由于不同的软件和系统使用不同的3D模型格式,跨平台、跨系统之间的数据交换和共享变得十分复杂。为了解决这一难题,Tech Soft 3D公司推出了HOOPS Exchange,一

    2024年03月27日
    浏览(42)
  • 【Golang 接口自动化00】为什么要用Golang做自动化?

    目录 为什么使用Golang做自动化 最终想实现的效果 怎么做? 写在后面  资料获取方法 顺应公司的趋势学习了Golang之后,因为没有太多时间和项目来实践,怕止步于此、步Java缺少练习遗忘殆尽的后尘,决定利用工作之余的时间把此前用Python的写的自动化使用golang进行重构。

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包