jasypt非对称加密
时间: 2025-01-16 11:05:12 浏览: 32
### 使用 Jasypt 进行非对称加密
在 Spring Boot 应用中,Jasypt 提供了强大的加密功能,不仅限于对称加密,也支持非对称加密。为了实现非对称加密,通常会涉及到公钥和私钥的操作。
#### 配置依赖项
要在项目中引入 Jasypt 支持非对称加密的能力,需先添加 Maven 或 Gradle 的依赖声明:
对于 Maven 用户来说,在 `pom.xml` 文件内加入以下内容:
```xml
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
<!-- 添加 BouncyCastle 作为安全提供者 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
```
而对于采用 Gradle 构建系统的开发者,则应在 build.gradle 中指定相应的模块版本号:
```groovy
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
// 加入Bouncy Castle的安全库
implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
```
#### 设置属性文件中的参数
接下来要做的就是在 application.properties (或 .yml) 文件里定义必要的配置选项来启用 RSA 方式的非对称加密机制:
```properties
# 定义用于解密操作所需的私钥路径以及其对应的密码(如果有的话)
jasypt.encryptor.private-key-location=classpath:/private.pem
jasypt.encryptor.password=myPrivateKeyPasswordIfAny
# 如果需要的话还可以设置额外的参数比如填充模式等...
jasypt.encryptor.provider-name=BC
jasypt.encryptor.algorithm=RSA/ECB/PKCS1Padding
```
这里需要注意的是,`provider-name` 属性指定了使用的 Java Security Provider,默认情况下是 SunJSSE;而当选择了 BC 即表示使用 BouncyCastle 实现更广泛的算法兼容性和更好的性能表现[^1]。
#### 创建并加载密钥对
为了让应用程序能够正常工作,必须事先准备好一对匹配好的公钥与私钥,并将其保存为 PEM 格式的文本文件形式存放在资源目录下以便读取访问。可以通过 OpenSSL 工具或者其他方式生成这些证书材料。
假设已经拥有了名为 private.pem 和 public.pem 的两个文件分别代表私钥和公钥,那么就可以按照上述方法进行设置了。
#### 编写测试代码验证效果
最后编写一段简单的单元测试程序用来检验整个流程是否正确无误地实现了预期的功能:
```java
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = YourApplication.class)
@EnableEncryptableProperties
public class NonSymmetricEncryptionTest {
@Value("${test.secret}")
String encryptedSecret;
@Test
void testNonSymmetricDecryption() {
System.out.println("The decrypted secret is: " + encryptedSecret);
// 断言逻辑可自行补充完善
}
}
```
在这个例子中,`${test.secret}` 是一个被 `{cipher}...` 包裹起来的实际经过编码处理后的字符串值,它会在运行期间自动解析回原始明文状态[^4]。
阅读全文
相关推荐



















