Spring Boot 进阶-深入了解Spring Boot 如何对配置文件数据进行加密( 二 )


EnableEncryptablePropertiesBeanFactoryPostProcessor 前置处理器则是加载一些与配置环境相关的内容 。也就是说需要使用Jasypt就必须要加载一些与它相关的配置 。例如我们下面要讲到的这个配置类就是在Spring Boot中我们经常会遇到的一个配置类的形式 。在这个配置类中定义了很多的关于我们引入配置如何进行全局配置的方式 。
JasyptEncryptorConfigurationProperties 配置项文件
这个配置类不同于我们以往遇到的配置类,在自动配置文件中进行了使用,这个配置类中有一个构造方法是值得我们关注的 。
public static JasyptEncryptorConfigurationProperties bindConfigProps(ConfigurableEnvironment environment) {final BindHandler handler = new IgnoreErrorsBindHandler(BindHandler.DEFAULT);final MutablePropertySources propertySources = environment.getPropertySources();final Binder binder = new Binder(ConfigurationPropertySources.from(propertySources),new PropertySourcesPlaceholdersResolver(propertySources),ApplicationConversionService.getSharedInstance());final JasyptEncryptorConfigurationProperties config = new JasyptEncryptorConfigurationProperties();final ResolvableType type = ResolvableType.forClass(JasyptEncryptorConfigurationProperties.class);final Annotation annotation = AnnotationUtils.findAnnotation(JasyptEncryptorConfigurationProperties.class,ConfigurationProperties.class);final Annotation[] annotations = new Annotation[]{annotation};final Bindable target = Bindable.of(type).withExistingValue(config).withAnnotations(annotations);binder.bind("jasypt.encryptor", target, handler);return config;
我们都知道,在之前的配置类使用过程中,我们都是通过@ConfigurationProperties(prefix = "jasypt.encryptor", ignoreUnknownFields = true) 这样的注解来进行属性值绑定的,但是这里这个配置类用到了BindHandler 进行数据属性绑定 。由于这个文件中的内容较多 。这里就不复制源码了,挑几个比较重要的属性进行说明
在这个文件中有一个属性比较重要,有很多人在使用过程中直接将加密串放到了配置文件中,就会引起各种各样的问题 。
* Specify a custom {@link String} to identify* as prefix of encrypted properties. Default value is* {@code "ENC("}private String prefix = "ENC(";* Specify a custom {@link String} to identify* as suffix of encrypted properties. Default value is {@code ")"}private String suffix = ")";
从意思中可以看出,它是为每个配置项加上了一个配置前缀,也就是说,每个配置项有了这个前缀之后才会生效 。
spring:datasource:url: ENC(uHOWjxcz6yEyEUnc0J99Pkmbyg5rkZcsgzH+nOnPnPF7iTu09FRlWSptxRMDF9+OEPfTZmARRm2F6hYtn6U/YeXQVO//OKEjFSNAuKaa1BvmWBqlxiHM1RERlTRqEYZ9zssgT9VNpSeSllW0J/RjNqN3xLHkfrePJTHW0a9flFTORYexuVviGWxmDrCM3qi4PTbAO5IV6bOjCB2+fFzaKI4zbJP4pLVX5uq8977roOg=)password: ENC(hMiBCsfEn0sKkLq8YXGNGWTGkLFCupAxWK0zJlr/uaGYR4U39F1fO+FmEQemmNCU)driver-class-name: com.mysql.jdbc.Driverusername: ENC(kB1Td66wuyfPW9qqQhPn/z/RjXhp3IL2H79fW6pS8T0QhNUrsP9lWaEpeIK6Qws1)
当然我们也可以修改这个配置前缀,改成我们自定义的配置前缀 。
另外需要注意的一点,在进行加密的时候我们是将密钥直接配置到了配置文件中 。
jasypt:encryptor:password: 123123123123123
【Spring Boot 进阶-深入了解Spring Boot 如何对配置文件数据进行加密】这样做是不安全的,如果有人拿到了源码,还可以通过分析的方式获取到相关的信息 。所以,最正确的做法是将我们的密钥添加到我们每次的jar命令启动的过程中如下
JAVA -jar xxxx.jar -Djasypt.encryptor.password=12312312322321
另外扩展说命名一下jasypt项目在GitHub上可以直接查询 。相关更高级的使用可以在GitHub上查看 。




推荐阅读