jasypt-spring-boot, Spring Boot的Jasypt集成

分享于 

20分钟阅读

GitHub

  繁體 雙語
Jasypt integration for String boot
  • 源代码名称:jasypt-spring-boot
  • 源代码网址:http://www.github.com/ulisesbocchio/jasypt-spring-boot
  • jasypt-spring-boot源代码文档
  • jasypt-spring-boot源代码下载
  • Git URL:
    git://www.github.com/ulisesbocchio/jasypt-spring-boot.git
    Git Clone代码到本地:
    git clone http://www.github.com/ulisesbocchio/jasypt-spring-boot
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/ulisesbocchio/jasypt-spring-boot
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    jasypt-spring-boot

    为 Spring Boot 1.4. X。1.5. X 和 2.0.0.x 提供收费的Jasypt 集成

    Build StatusGitterMaven Central

    Code ClimateCodacy BadgeGitHub releaseGithub All ReleasesMIT License

    Paypal

    Jasypt Spring Boot 为 Spring Boot 应用程序中的属性源提供加密支持。
    在项目中集成 jasypt-spring-boot的方法有 3种:

    • 只要使用 @SpringBootApplication 或者 @EnableAutoConfiguration 将启动 jar jasypt-spring-boot-starter 添加到类路径中,就可以在整个 spring 环境中启用encryptable属性
    • 向类路径添加 jasypt-spring-boot 并向主配置类添加 @EnableEncryptableProperties,以便在整个 spring 环境中启用encryptable属性
    • 向类路径添加 jasypt-spring-boot 并使用 @EncrytablePropertySource 声明单个encryptable属性源

    :先做什么

    更新 7/18/2015: jasypt-spring-boot 现在位于 Maven 中心 !
    使用以下 3方法之一( 上简要解释):

    如果你的Spring Boot 应用程序使用 @SpringBootApplication 或者 @EnableAutoConfiguration 和encryptable属性在整个 spring 环境( 这意味着任何系统属性。环境属性。命令行 参数。应用程序。属性。yaml属性和任何其他自定义属性源都可以包含加密属性。) 中启用,则简单地添加起始 jar 依赖项:

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

    如果不使用 @SpringBootApplication 或者 @EnableAutoConfiguration 自动配置注释,则将这里依赖项添加到项目中:

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

    然后将 @EnableEncryptableProperties 添加到配置类。 举个例子:

    @Configuration@EnableEncryptablePropertiespublicclassMyApplication {
     ...}

    将在整个 spring 环境中启用encryptable属性( 这意味着任何系统属性。环境属性。命令行 参数。) 属性。

    在不使用 @SpringBootApplication 或者 @EnableAutoConfiguration 自动配置注释的情况下,如果不希望在整个 spring 环境中启用encryptable属性,则有第三个选项。 首先将以下依赖项添加到项目中:

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

    然后在配置文件中添加任意数量的@EncryptablePropertySource 注释。 就像你对 spring 注释的@PropertySource 一样。 举个例子:

    @Configuration@EncryptablePropertySource(name="EncryptedProperties", value="classpath:encrypted.properties")publicclassMyApplication {
     ...}

    很方便,还有一个 @EncryptablePropertySources 注释可以用来对 @EncryptablePropertySource 类型的注释进行分组,如下所示:

    @Configuration@EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),
     @EncryptablePropertySource("classpath:encrypted2.properties")})
     publicclassMyApplication {
     ... }

    另外,请注意,在版本 1.8中,@EncryptablePropertySource 支持YAML文件

    自定义环境

    对于 1.7 1.15,一些特殊情况下存在启用encryptable属性的4th 方法。 提供了自定义 ConfigurableEnvironment 类: EncryptableEnvironmentStandardEncryptableEnvironmentStandardEncryptableServletEnvironment 可以与 SpringApplicationBuilder 一起使用,以这种方式定义自定义环境:

    newSpringApplicationBuilder()
    . environment(newStandardEncryptableEnvironment())
    . sources(YourApplicationClass.class).run(args);

    这里方法只需要对 jasypt-spring-boot 使用依赖项。 注意 EncryptableEnvironment 只是包装器,因此你必须提供实际的环境实现,在本例中是 StandardServletEnvironment。 不需要启动 jar 依赖项。 这里方法对于早期访问 Bootstrap 上的加密属性非常有用。 虽然在定制引导行为或者集成早期配置的某些功能( 比如日志记录配置) 时,大多数场景中都不需要使用这些功能,但这。 对于具体示例,这种启用encryptable属性的方法是使用 springProperty 标记在 logback-spring.xml 文件中使用 spring 属性替换的惟一方法。 举个例子:

    <springPropertyname="user"source="db.user"/>
    <springPropertyname="password"source="db.password"/>
    <appendername="db"class="ch.qos.logback.classic.db.DBAppender">
     <connectionSourceclass="ch.qos.logback.core.db.DriverManagerConnectionSource">
     <driverClass>org.postgresql.Driver</driverClass>
     <url>jdbc:postgresql://localhost:5432/simple</url>
     <user>${user}</user>
     <password>${password}</password>
     </connectionSource>
    </appender>

    机制可以用于实例( 如所示),以初始化需要传递敏感凭据的数据库日志附加组件。 或者,如果需要提供自定义 StringEncryptor,则还需要第二个构造函数 EncryptableEnvironment(ConfigurableEnvironment, StringEncryptor) 可以用于这里目的。

    如何工作?

    这将触发一些配置,这些配置基本上完成 2个操作:

    • 它注册一个 spring 后置处理器,以装饰包含在环境中的所有PropertySource对象,因此它们是"加密识别",当属性的以下属性被加密时检测到属性。
    • 它定义了一个默认 StringEncryptor,可以通过常规属性。系统属性或者 命令行 参数进行配置。

    ,我该在哪里放置加密属性?

    使用方法 1和 2时,你可以在环境中包含的任何PropertySource中定义加密属性。 例如使用 @PropertySource 注释:

    @SpringBootApplication@EnableEncryptableProperties@PropertySource(name="EncryptedProperties", value="classpath:encrypted.properties")
     publicclassMyApplication {
     ... }

    你的encrypted.properties 文件将如下所示:

    secret.property=ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)

    当你做的时候 environment.getProperty("secret.property") 或者使用 @Value("${secret.property}"),你得到的是 secret.property的解密版本。
    如果使用方法 3 ( @EncryptablePropertySource ) 同样可以访问加密属性,则唯一的区别是必须在 @EncryptablePropertySource 注释中声明属性。

    加密配置

    Jasypt使用 StringEncryptor 来解密属性。 对于所有 3种方法,如果在 spring 上下文中没有找到自定义 StringEncryptor ( 有关详细信息,请参阅自定义加密部分),则会自动创建以下属性( 系统,属性文件,命令行 参数,环境变量,等等 ):

    密钥必选默认值
    jasypt.encryptor.passwordTrue-
    jasypt.encryptor.algorithmFalsePBEWithMD5AndDES
    jasypt.encryptor.keyObtentionIterationsFalse1000
    jasypt.encryptor.poolSizeFalse1
    jasypt.encryptor.providerNameFalseSunJCE
    jasypt.encryptor.providerClassNameFalse
    jasypt.encryptor.saltGeneratorClassnameFalseorg.jasypt.salt.RandomSaltGenerator
    jasypt.encryptor.stringOutputTypeFalsebase64
    jasypt.encryptor.proxyPropertySourcesFalsefalse

    唯一需要的属性是加密密码,剩下的就可以使用默认值。 当你的属性可以被声明为系统属性时,它应该作为系统属性,命令行 参数或者环境变量,它将工作在属性文件中。

    最后一个属性 jasypt.encryptor.proxyPropertySources 用于指示 jasyp-spring-boot 如何为解密而截获属性值。 默认值,false 使用 PropertySourceEnumerablePropertySourceMapPropertySource的自定义包装器实现。 为此属性指定 true 时,拦截机制将在每个特定的PropertySource 实现上使用CGLib代理。 这在原始 PropertySource的类型必须保留的某些情况下很有用。

    使用你自己的自定义加密程序

    你可以在 spring 上下文中定义自己的StringEncryptor bean,并忽略默认的加密程序。 举个例子:

    @Bean("jasyptStringEncryptor")
     publicStringEncryptor stringEncryptor() {
     PooledPBEStringEncryptor encryptor =newPooledPBEStringEncryptor();
     SimpleStringPBEConfig config =newSimpleStringPBEConfig();
     config.setPassword("password");
     config.setAlgorithm("PBEWithMD5AndDES");
     config.setKeyObtentionIterations("1000");
     config.setPoolSize("1");
     config.setProviderName("SunJCE");
     config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
     config.setStringOutputType("base64");
     encryptor.setConfig(config);
     return encryptor;
     }

    注意,需要bean名,因为 jasypt-spring-boot 按版本 1.5的名称检测自定义字符串 Encyptors。 默认的bean名称为:

    jasyptStringEncryptor

    但是,也可以通过定义属性重写这里方法:

    jasypt.encryptor.bean

    例如如果你定义了 jasypt.encryptor.bean=encryptorBean 然后,你可以使用该名称定义自定义加密程序:

    @Bean("encryptorBean")
     publicStringEncryptor stringEncryptor() {
     ... }

    自定义属性检测器,前缀,后缀和/或者解析器

    jasypt-spring-boot-1.10 而言,有新的扩展点。 EncryptablePropertySource 现在使用 EncryptablePropertyResolver 来解析所有属性:

    publicinterfaceEncryptablePropertyResolver {
     StringresolvePropertyValue(Stringvalue);
    }

    这里接口的实现既负责检测,又负责收费的属性。 默认实现,DefaultPropertyResolver 使用前面提到的StringEncryptor 和一个新的EncryptablePropertyDetector

    提供自定义 EncryptablePropertyDetector

    如果你想提供一个类型为的Bean,或者你想提供自己的Bean名,重写属性,可以覆盖默认实现。 jasypt.encryptor.property.detector-bean 并指定要给bean的名称。 提供这里选项时,你将负责检测加密属性。 例如:

    privatestaticclassMyEncryptablePropertyDetectorimplementsEncryptablePropertyDetector {
     @OverridepublicbooleanisEncrypted(Stringvalue) {
     if (value !=null) {
     return value.startsWith("ENC@");
     }
     returnfalse;
     }
     @OverridepublicStringunwrapEncryptedValue(Stringvalue) {
     return value.substring("ENC@".length());
     }
    }
    @Bean(name="encryptablePropertyDetector")
     publicEncryptablePropertyDetector encryptablePropertyDetector() {
     returnnewMyEncryptablePropertyDetector();
     }

    提供自定义加密属性 prefixsuffix

    如果要做的所有操作都是对加密属性有不同的前缀/后缀,则可以继续使用 application.properties ( 或者 application.yml ) 中的以下属性:

    jasypt:
     encryptor:
     property:
     prefix: "ENC@["suffix: "]"

    提供自定义 EncryptablePropertyResolver

    如果你想提供一个类型为的Bean,或者你想提供自己的Bean名,重写属性,可以覆盖默认实现。 jasypt.encryptor.property.resolver-bean 并指定要给bean的名称。 提供这里选项时,你将负责检测和解密加密属性。 例如:

    classMyEncryptablePropertyResolverimplementsEncryptablePropertyResolver {
     privatefinalPooledPBEStringEncryptor encryptor;
     publicMyEncryptablePropertyResolver(char[] password) {
     this.encryptor =newPooledPBEStringEncryptor();
     SimpleStringPBEConfig config =newSimpleStringPBEConfig();
     config.setPasswordCharArray(password);
     config.setAlgorithm("PBEWithMD5AndDES");
     config.setKeyObtentionIterations("1000");
     config.setPoolSize(1);
     config.setProviderName("SunJCE");
     config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
     config.setStringOutputType("base64");
     encryptor.setConfig(config);
     }
     @OverridepublicStringresolvePropertyValue(Stringvalue) {
     if (value !=null&& value.startsWith("{cipher}")) {
     return encryptor.decrypt(value.substring("{cipher}".length()));
     }
     return value;
     }
     }
    @Bean(name="encryptablePropertyResolver")
     EncryptablePropertyResolver encryptablePropertyResolver(@Value("${jasypt.encryptor.password}") String password) {
     returnnewMyEncryptablePropertyResolver(password.toCharArray());
     }

    注意,通过重写 EncryptablePropertyResolver,可以能对前缀。后缀。EncryptablePropertyDetectorStringEncryptor的任何它的他配置或者重写都会停止工作。 你得自己把所有的东西都 wire。 在大多数情况下,你不需要重写这个 bean,前面的选项应该足够了。

    但是,在实现中可以看到,加密属性的检测和解密是 MyEncryptablePropertyResolver 内部

    演示程序

    jasypt-spring-boot-demo-samples repo 包含工作 Spring Boot 应用示例。 主 jasypt-spring-boot-demo 演示应用程序在应用程序运行前使用加密密码显式设置一个系统属性。 要有更加真实的场景,请尝试删除系统属性设置的行,用 Maven 构建应用程序,并运行:

    
     java -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password
    
    
    
    

    你将把加密密码作为 命令行 参数传递。 像这样运行:

    
     java -Djasypt.encryptor.password=password -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar
    
    
    
    

    你将把加密密码作为系统属性传递。

    如果你需要将这里属性作为环境变量传递,可以通过创建 application.properties 或者 application.yml 并添加以下内容来完成这里操作:

    
    jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}
    
    
    
    

    或者用 YAML

    
    jasypt:
    
    
     encryptor:
    
    
     password: ${JASYPT_ENCRYPTOR_PASSWORD:}
    
    
    
    

    基本上就是定义指向另一个属性 JASYPT_ENCRYPTOR_PASSWORDjasypt.encryptor.password 属性,你可以使用环境变量设置它,也可以通过系统属性来替代。 这里技术还可以用于转换所需的任何其他库的属性名称/值。 这在演示程序中也可用。 这样你就可以像这样运行演示程序:

    
    JASYPT_ENCRYPTOR_PASSWORD=password java -jar target/jasypt-spring-boot-demo-1.5-SNAPSHOT.jar
    
    
    
    

    注意:当使用Gradle作为构建工具时,processResources任务失败,因为'$'字符,要解决这个问题,你只需要像下面这个例子那样scape这个变量。

    其他演示应用

    虽然是展示加密/解密属性的所有可能方法的全面演示,但还有一些演示独立场景的演示。

    Flattr this git repo


    INT  BOO  引导  整合  Spring  Spring Boot  
    相关文章