我有 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 Boot 2.1.3 上也遇到了同样的问题。但后来我发现这只是我的愚蠢案例。我只是理解“输入”和“密码”参数含义之间的错误。当我在命令提示符下加密时,我认为“输入”意味着密钥,然后当我运行应用程序时,我在其中两个之间交换值。
所以,请记住:
输入=[您的真实密码]
密码=[是jasypt密钥]
如果这不是您的根本原因,则需要考虑的另一件事是,当您在 Windows 上加密密码时,它可能无法在 Linux 上使用。当需要在 Linux 上运行应用程序时,您可能必须在 Linux 上加密。
我尝试了以下几件事(1到7)来解决这个异常,我几乎一整天都在疯狂。我整合了我的方法并最终决定将其写成对此异常的答案。希望它以某种或其他方式有所帮助,或者至少通过这个答案为您提供其他可能的方式。
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 文件中,如下面的链接所述。
以下是不同的技术,只是为了学习新的、最新的不同技术,我想在我的微服务中使用这些技术,这些技术对我来说效果很好,但我觉得有点矫枉过正。但拥有一些时间、空间、自由和好奇心并没有伤害我。你也可以测试一下。