当前位置:首页 > 科技  > 软件

SpringBoot中的敏感信息的配置进行加密处理,这种方式你知道吗?

来源: 责编: 时间:2023-08-20 23:17:13 621观看
导读环境:Springboot2.4.12 + Spring Cloud Context 3.0.5概述SpringBoot配置文件中的内容通常情况下是明文显示,安全性就比较低一些。在application.properties或application.yml,比如数据库配置信息的密码,Redis配置的密码

环境:Springboot2.4.12 + Spring Cloud Context 3.0.5l9M28资讯网——每日最新资讯28at.com

概述

SpringBoot配置文件中的内容通常情况下是明文显示,安全性就比较低一些。在application.properties或application.yml,比如数据库配置信息的密码,Redis配置的密码等都是通过明文配置的,为了提供系统整体的安全性,我们需要对这些敏感的信息进行加密处理,这样即便你难道了我的配置信息你也获取不到有价值的信息。l9M28资讯网——每日最新资讯28at.com

在Springboot下我们可以通过如下两种方式简单的实现敏感信息的加密处理:l9M28资讯网——每日最新资讯28at.com

  1. Jasypt这是国外的一个开源加密工具包,功能强大。
  2. 基于EnvironmentPostProcessor实现我们可以通过实现这么一个接口来实现自己的加解密处理,我们也可以通过引入spring-cloud-context包,在该包中提供了一个DecryptEnvironmentPostProcessor处理器进行对加密信息进行解密。

关于Jasypt网上介绍的很多,这里不做介绍。这里我们主要只讲Spring Cloud Context中提供的这个EnvironmentPostprocessor。l9M28资讯网——每日最新资讯28at.com

环境配置

<dependency>  <groupId>org.springframework.cloud</groupId>  <artifactId>spring-cloud-context</artifactId>  <version>3.0.5</version></dependency>

应用配置l9M28资讯网——每日最新资讯28at.com

encrypt:  key: 123456789 #密钥  salt: abcdef #加密的内容使用了加盐处理---spring:  cloud:    decrypt-environment-post-processor:      enabled: true #开启解密功能

程序代码

现在需要对custom.password这样的一个key值进行加密处理l9M28资讯网——每日最新资讯28at.com

custom:  password:  123456

首先需要对这明文生成加密的内容,如下方式:l9M28资讯网——每日最新资讯28at.com

public static void main(String[] args) throws Exception {  String key = "123456789" ;  String salt = "abcdef" ;  String text = "123123" ;  KeyProperties keyProperties = new KeyProperties() ;  keyProperties.setKey(key) ;  keyProperties.setSalt(salt) ;  String result = TextEncryptorUtils.createTextEncryptor(keyProperties, null).encrypt(text) ;  System.out.println(result) ;}

通过上面的代码就可以生成加密信息,接下来就是将加密后的内容配置到配置文件中l9M28资讯网——每日最新资讯28at.com

custom:  password:  "{cipher}2a483a44681006be6f0730b1acb45325c6bd20abe37369ef4fdb52c2e194a365"

注意:这里的内容是有格式要求的必须是:{cipher}开头。这里还有一点需要注意有可能你运行上面的代码会报错,报错信息应该是 “Illegal key size” (非法的密钥大小),比如:AES加密算法在默认JDK(Sun的JDK)配置情况下支持的密钥大小是128位,一旦超过就会报错,这时候你需要安装Java加密扩展(JCE)策略文件。下面提供了3个版本的JCE策略文件。l9M28资讯网——每日最新资讯28at.com

Java 6 JCE:l9M28资讯网——每日最新资讯28at.com

https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.htmll9M28资讯网——每日最新资讯28at.com

Java 7 JCEl9M28资讯网——每日最新资讯28at.com

https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.htmll9M28资讯网——每日最新资讯28at.com

Java 8 JCEl9M28资讯网——每日最新资讯28at.com

https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.htmll9M28资讯网——每日最新资讯28at.com

下载对应的版本后将其解压如下位置:l9M28资讯网——每日最新资讯28at.com

JCE策略文件安装目录JCE策略文件安装目录l9M28资讯网——每日最新资讯28at.com

以上操作完成以后在运行上面的程序就能输出结果了,然后将结果替换配置文件内容即可。l9M28资讯网——每日最新资讯28at.com

接下来测试:l9M28资讯网——每日最新资讯28at.com

@Value("${custom.password}")public String pwd ;  @GetMapping("/pwd")public String pwd() {  return pwd ;}

图片l9M28资讯网——每日最新资讯28at.com

正确的输出了我们的内容l9M28资讯网——每日最新资讯28at.com

原理

关于EnvironmentPostProcessor接口编写完成以后都会进行配置,我们上面引入的context包就对DecryptEnvironmentPostProcessor进行了配置:l9M28资讯网——每日最新资讯28at.com

配置EnvironmentPostProcessor配置EnvironmentPostProcessorl9M28资讯网——每日最新资讯28at.com

public class DecryptEnvironmentPostProcessor extends AbstractEnvironmentDecrypt implements EnvironmentPostProcessor, Ordered {  @Override  public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {    // 判断是否开启了功能    if (bootstrapEnabled(environment) || useLegacyProcessing(environment) || !isEnabled(environment)) {      return;    }    // 如果环境中不存在TextEncryptor那么也不会开启    if (!ClassUtils.isPresent("org.springframework.security.crypto.encrypt.TextEncryptor", null)) {      return;    }    // 获取当前环境下的所有配置属性    MutablePropertySources propertySources = environment.getPropertySources();    environment.getPropertySources().remove(DECRYPTED_PROPERTY_SOURCE_NAME);    // 解密所有的配置属性,这里也就是入口了    Map<String, Object> map = TextEncryptorUtils.decrypt(this, environment, propertySources);    if (!map.isEmpty()) {      // 将解密后的配置添加到环境中(addFirst 表示了添加到具有最高优先级的给定属性源对象)      propertySources.addFirst(new SystemEnvironmentPropertySource(DECRYPTED_PROPERTY_SOURCE_NAME, map));    }  }  protected Boolean isEnabled(ConfigurableEnvironment environment) {    // 获取配置属性值,是否开启功能    return environment.getProperty("spring.cloud.decrypt-environment-post-processor.enabled", Boolean.class, true);  }}

解密配置l9M28资讯网——每日最新资讯28at.com

public abstract class TextEncryptorUtils {  static Map<String, Object> decrypt(AbstractEnvironmentDecrypt decryptor, ConfigurableEnvironment environment, MutablePropertySources propertySources) {    // 获取加解密服务接口    TextEncryptor encryptor = getTextEncryptor(decryptor, environment);    return decryptor.decrypt(encryptor, propertySources);  }  static TextEncryptor getTextEncryptor(AbstractEnvironmentDecrypt decryptor, ConfigurableEnvironment environment) {    Binder binder = Binder.get(environment);    // 将属性配置以 ‘encrypt’开头的都绑定到KeyProperties对象中    KeyProperties keyProperties = binder.bind(KeyProperties.PREFIX, KeyProperties.class).orElseGet(KeyProperties::new);    // 检查是否配置了encrypt.key 等核心的信息    if (TextEncryptorUtils.keysConfigured(keyProperties)) {      decryptor.setFailOnError(keyProperties.isFailOnError());      // 检查是否当前CLASSPATH中是否存在RsaSecretEncryptor      if (ClassUtils.isPresent("org.springframework.security.rsa.crypto.RsaSecretEncryptor", null)) {        RsaProperties rsaProperties = binder.bind(RsaProperties.PREFIX, RsaProperties.class).orElseGet(RsaProperties::new);        return TextEncryptorUtils.createTextEncryptor(keyProperties, rsaProperties);      }      // 如果你没有使用及配置Rsa相关的,那么就会在这里创建加解密服务接口,这里跟踪了下使用的是AES加密算法      return new EncryptorFactory(keyProperties.getSalt()).create(keyProperties.getKey());    }    // no keys configured    return new TextEncryptorUtils.FailsafeTextEncryptor();  }}

获取到了加解密服务接口以后,接下来就是对配置属性进行解密操作。l9M28资讯网——每日最新资讯28at.com

public class AbstractEnvironmentDecrypt {  public static final String ENCRYPTED_PROPERTY_PREFIX = "{cipher}";  protected Map<String, Object> decrypt(TextEncryptor encryptor, PropertySources propertySources) {    Map<String, Object> properties = merge(propertySources);    // 解密处理    decrypt(encryptor, properties);    return properties;  }  protected void decrypt(TextEncryptor encryptor, Map<String, Object> properties) {    // 开始替换所有以{cipher}开头的属性值    properties.replaceAll((key, value) -> {      String valueString = value.toString();      if (!valueString.startsWith(ENCRYPTED_PROPERTY_PREFIX)) {        return value;      }      // 解密数据, key 配置属性的key, valueString要解密的数据      return decrypt(encryptor, key, valueString);    });  }  protected String decrypt(TextEncryptor encryptor, String key, String original) {    // 截取{cipher}之后的内容    String value = original.substring(ENCRYPTED_PROPERTY_PREFIX.length());    try {       // 解密数据      value = encryptor.decrypt(value);      return value;    } catch (Exception e) {      // ...      return "";    }  }}

整个源码处理还是非常简单的。l9M28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-6190-0.htmlSpringBoot中的敏感信息的配置进行加密处理,这种方式你知道吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: GitHub和码云上,七个H5页面制作工具推荐

下一篇: Go 语言中排序的三种方法

标签:
  • 热门焦点
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 从 Pulsar Client 的原理到它的监控面板

    从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    据官方此前宣布,三星将于7月26日也就是今天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • OPPO K11评测:旗舰级IMX890加持 2000元档最强影像手机

    OPPO K11评测:旗舰级IMX890加持 2000元档最强影像手机

    【Techweb评测】中端机型用户群体巨大,占了中国目前手机市场的大头,一直以来都是各手机品牌的“必争之地”,其中OPPO K系列机型一直以来都以高品质、
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top
Baidu
map