jasypt-spring-boot-1.17:解密属性失败,请确保加密/解密密码匹配

问题描述 投票:0回答:2

我有 jasypt-spring-boot-1.17,带有 spring 版本“4.2.5.RELEASE”和 spring Boot 版本“1.5.3.RELEASE”。

我正在使用此网站的第一种方法(https://github.com/ulisesbocchio/jasypt-spring-boot),因为我在 application.java 类中使用@SpringBootApplication。

我做了第一次测试。 1. 我在 ApplicationMain.java 中使用了 @PropertySource("classpath:sampleservices.yml") 或 @PropertySource("classpath:sampleservices.properties") 表示法。 2. 我将 ENC() 密码保存在单独的文件中,即sampleservices.yml 或sampleservices.properties。 3. 我在 application.yml 文件中定义了以下代码。我在环境变量中为 JASYPT_ENCRYPTOR_PASSWORD 设置了纯密码值。测试成功。 贾西普特: 加密器: bean: 加密器Bean 密码:${JASYPT_ENCRYPTOR_PASSWORD:}

但是,真正的加密 ENC() 密码以以下嵌套方式存储在我的 application.yml 文件中。请让我知道我到底应该实施什么才能使解密过程成功。我需要使用这个解密的密码来登录数据库。

我确实更改了此代码 @PropertySource("application.yml") 但我不知道如何访问此处的密码字段。

来自 application.yml 文件: 春天: 型材:样品 数据源: 驱动程序类名称:com.mysql.jdbc.Driver 网址:jdbc:mysql:abc 用户名:用户ID 密码:ENC(xxxxxxxx)

I kept getting this error.

com.ulisesbocchio.jasyptspringboot.exception.DecryptionException: Decryption of Properties failed,  make sure encryption/decryption passwords match
at com.ulisesbocchio.jasyptspringboot.resolver.DefaultPropertyResolver.resolvePropertyValue(DefaultPropertyResolver.java:37) ~[jasypt-spring-boot-1.17.jar!/:?]

Thanks a lot!
spring passwords jasypt
2个回答
1
投票

我在 Spring Boot 2.1.3 上也遇到了同样的问题。但后来我发现这只是我的愚蠢案例。我只是理解“输入”和“密码”参数含义之间的错误。当我在命令提示符下加密时,我认为“输入”意味着密钥,然后当我运行应用程序时,我在其中两个之间交换值。

所以,请记住:

输入=[您的真实密码]

密码=[是jasypt密钥]

如果这不是您的根本原因,则需要考虑的另一件事是,当您在 Windows 上加密密码时,它可能无法在 Linux 上使用。当需要在 Linux 上运行应用程序时,您可能必须在 Linux 上加密。


1
投票

我尝试了以下几件事(1到7)来解决这个异常,我几乎一整天都在疯狂。我整合了我的方法并最终决定将其写成对此异常的答案。希望它以某种或其他方式有所帮助,或者至少通过这个答案为您提供其他可能的方式。

最新的 Jasypt maven 依赖项

1)

pom.xml

<!-- JASYPT Maven Dependency --> 
<dependency>
 <groupId>com.github.ulisesbocchio</groupId>
 <artifactId>jasypt-spring-boot-starter</artifactId>
 <version>3.0.3</version>
</dependency>

<!-- JASYPT Maven Plugin-->    
<build>
 <plugins>
   <plugin>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-maven-plugin</artifactId>
    <version>3.0.3</version>
   </plugin>
  </plugins>
</build>

2)

@EnableEncryptableProperties
- 类级别注释 我将它添加到我的配置类中,您也可以将它添加到具有 main 方法的应用程序类中。我尝试了两者,效果很好,但更喜欢将其保留在配置类中。

3)更改了我的加密算法。到

PBEWITHHMACSHA512ANDAES_256
早些时候我使用过
PBEWithMD5AndDES
,效果也很好。由于细节较少,我更喜欢使用 AES-SHA,而不是 DES-MD5。

4) 添加了 IvGenerator

org.jasypt.iv.RandomIvGenerator
我添加了 config.setIvGeneratorClassName( "org.jasypt.iv.RandomIvGenerator") ,它是执行加密/解密时具有附加初始化向量密钥的类。

5) 创建单元测试(Spock/JUnit) 我还编写了一个小型 spock 单元测试用例,我诚实地使用它为所有客户端机密生成加密密钥,这也帮助我测试 jasypt 技术的单元逻辑。

Spock
单元测试是用
groovy
语言编写的,与java几乎相同。因此,如果您不了解 groovy,只需在 Java 中通过此代码并将 def 更改为适当的 RHS 一侧并更改方法名称并在方法级别添加
@Test
以及
JUnit
的其他必需内容。

void "Test the custom JASYPT encryptor functionality"() {
        given: "OriginalPlainTextSecret and PrivateKey"
        def OriginalPlainTextSecret = "SECRET_2B_ENCRYPTED_and_ENCODED_base64"

        // JASYPT private key used for ciphering the actual secret. This key is not meant to be encrypted!
        // It is intentionally kept same/common across all profiles/environments for simplicity.
        def privateKey = environment.getRequiredProperty("jasypt.encryptor.privatekey")

        def encryptor = new PooledPBEStringEncryptor()
        def config = new SimpleStringPBEConfig()
        config.setPassword(privateKey) // an additional private key required for encryption & decryption
        config.setAlgorithm(CommonConstants.JASYPT_ENC_ALGO)
        config.setKeyObtentionIterations(CommonConstants.OBTENTION_ITERATION)
        config.setPoolSize(CommonConstants.POOL_SIZE)
        config.setProviderName(CommonConstants.PROVIDER_NAME)
        config.setSaltGeneratorClassName(CommonConstants.JASYPT_SALT_GENERATOR)
        config.setIvGeneratorClassName(CommonConstants.JASYPT_INIT_VECTOR)
        config.setStringOutputType(CommonConstants.BASE64_ENCODE)
        encryptor.setConfig(config)

        when: "When encryption & decryption is executed"
        def encryptedData = encryptor.encrypt(OriginalPlainTextSecret)
        def decryptedData = encryptor.decrypt(encryptedData)

        then: "Validate the keys used"
        println("ORIGINAL SECRET : " + OriginalPlainTextSecret)
        println("ENCRYPTED SECRET : " + encryptedData)
        println("DECRYPTED SECRET : " + decryptedData);
        println("Is DECRYPTED SECRET identical as the ORIGINAL SECRET? :: " + OriginalPlainTextSecret.contentEquals(decryptedData))
    }

6)

Simplified the private key
(密码 - 用于加密的额外密钥) 我的私钥,即密码(额外的密钥)不必要地太复杂,我把它简化了。 以下是一些 Maven 命令,可以帮助您理解这一点

7)

application.yaml
application.properties
的不同 Maven 命令 如果您正在使用
application.properties

mvn jasypt:encrypt -Djasypt.encryptor.password=UR_PRIVATE_KEY

如果您正在使用

application.yaml
- 我的文件被放置在嵌套的 /config 文件夹下

mvn jasypt:encrypt -Djasypt.encryptor.password=UR_PRIVATE_KEY -Djasypt.plugin.path="file:src/main/resources/config/application.yaml"

这里,-Djasypt.encryptor.password=UR_PRIVATE_KEY 是附加的 jasypt 加密器的私钥。不要将您的客户密码/您的数据库密码放在这里! 您需要将它们放入您的 yaml/properties 文件中,如下面的链接所述。

  1. 供读者使用的 JASYPT 博客链接
  2. YouTube 链接,供不耐烦的人使用
  3. GitHub 链接 - 源代码
  4. Jasypt在线加解密工具

以下是不同的技术,只是为了学习新的、最新的不同技术,我想在我的微服务中使用这些技术,这些技术对我来说效果很好,但我觉得有点矫枉过正。但拥有一些时间、空间、自由和好奇心并没有伤害我。你也可以测试一下。

  1. AES-GSM 密码方案和 ChaCha20-Poly1305 密码方案博客
  2. AES-GSM 密码方案 GitHub
  3. ChaCha20-Poly1305 密码方案
© www.soinside.com 2019 - 2024. All rights reserved.