| 
                            
                                  一、使用步骤介绍使用Jasypt(Java Simplified Encryption)进行数据加密和解密主要涉及几个步骤,包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中,以及应用程序启动时自动解密。以下是详细的使用说明: 1. 引入依赖首先,你需要在你的项目中引入Jasypt的依赖。如果你是使用Maven构建项目,可以在pom.xml文件中添加如下依赖(注意版本号可能随时间更新,请参考最新版本): 
	
		
			| 1 2 3 4 5 | <dependency>     <groupId>com.github.ulisesbocchio</groupId>     <artifactId>jasypt-spring-boot-starter</artifactId>     <version>3.0.5</version> </dependency> |  可根据需要替换成最新的版本号。 2. 配置加密密码Jasypt需要一个密码来进行加密和解密操作。你可以通过以下几种方式配置这个密码: 在配置文件中指定:在你的application.properties或application.yml配置文件中,添加jasypt.encryptor.password配置项,并设置你的密码。例如: 
	
		
			| 1 2 | # application.properties jasypt.encryptor.password=your_encryption_password |  或者,在application.yml中: 
	
		
			| 1 2 3 | jasypt:   encryptor:     password: your_encryption_password |  
	
	然而,将密码直接写在配置文件中可能存在安全风险。因此,更推荐的做法是通过启动参数或环境变量来传递这个密码。
	通过启动参数指定:在启动应用程序时,可以通过-Djasypt.encryptor.password=your_encryption_password参数来指定加密密码。
	使用环境变量:在某些情况下,使用环境变量来存储敏感信息(如加密密码)可能更为安全。具体方法取决于你的应用程序部署环境。 3. 加密敏感信息在配置加密密码后,你可以使用Jasypt提供的工具或API来加密你的敏感信息。加密后的信息将以密文形式存储。 4. 将加密信息存储到配置文件中加密敏感信息后,你需要将这些加密后的信息存储到配置文件中。在Jasypt中,加密后的信息通常以ENC(...)的形式出现,括号内是加密后的密文。例如: 
	
		
			| 1 2 | # application.properties datasource.password=ENC(加密后的密码) |  5. 应用程序启动时自动解密当你的Spring Boot应用程序启动时,Jasypt会自动检测配置文件中的ENC(...)字符串,并使用你配置的加密密码来解密这些字符串。解密后的明文将用于应用程序的配置中。 注意事项
	安全性:确保你的加密密码足够复杂且安全存储,避免将密码直接写在配置文件中。版本兼容性:注意你使用的Jasypt版本与其他库或框架的兼容性。算法选择:Jasypt支持多种加密算法,你可以根据需要在配置文件中指定加密算法。 通过以上步骤,你可以在你的Spring Boot应用程序中使用Jasypt来加密和解密配置文件中的敏感信息。 二、使用示例代码1、通过工具类生成密文 在application.properties 中增加配置,或者通过-Djasypt.encryptor.password=123456参数来指定加密密码 
	
		
			| 1 2 | # 用于加密的密码 jasypt.encryptor.password=123456 |  使用 stringEncryptor.encrypt() 生成密文 
	
		
			| 1 2 3 4 5 6 7 8 9 10 11 12 | public class JasyptSecretTest {     @Autowired     private StringEncryptor stringEncryptor;     @Value("${datasource.password}")     private String password;     @Test     public void encrypt(){         // 加密         String encrypt = stringEncryptor.encrypt("root");         System.out.println("encrypt = " + encrypt);     } } |  2、在application.properties 中增加配置密文 
	
		
			| 1 2 3 4 | # 加密后的密文,包裹在ENC() 中 datasource.password=ENC(grdksstYZMsPmwvA0ALHXpzBQN2YTyA3t4ow1PDfJzbl+UV0LdO8UlajWKeqUF7y) # 用于加密的密码 jasypt.encryptor.password=123456 |  3、使用 @Value() 获取明文,也可以通过stringEncryptor.decrypt(encrypt)手动解密 
	
		
			| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @SpringBootTest public class JasyptSecretTest {     @Autowired     private StringEncryptor stringEncryptor;     @Value("${datasource.password}")     private String password;     @Test     public void encrypt(){         // 加密         String encrypt = stringEncryptor.encrypt("root");         System.out.println("encrypt = " + encrypt);         // 解密,输入获取的加密字符串进行解密         String decrypt = stringEncryptor.decrypt(encrypt);         System.out.println("decrypt = " + decrypt);     }     @Test     public void show(){         System.out.println("password = " + password);     } } |  原理说明SpringBoot项目在启动过程中,会自动注入beanStringEncryptor,用于根据不同的加密算法初始化不同的加解密实现类,通过StringEncryptorBuilder.build()初始化不同的加密算法 
BeanNamePlaceholderRegistryPostProcessor 
	
		
			| 1 2 3 4 5 6 7 8 | @Bean(name = ENCRYPTOR_BEAN_NAME) public StringEncryptor stringEncryptor(         final EnvCopy envCopy,         final BeanFactory bf) {     final String customEncryptorBeanName = envCopy.get().resolveRequiredPlaceholders(ENCRYPTOR_BEAN_PLACEHOLDER);     final boolean isCustom = envCopy.get().containsProperty(ENCRYPTOR_BEAN_PROPERTY);     return new DefaultLazyEncryptor(envCopy.get(), customEncryptorBeanName, isCustom, bf); } |  通过EncryptableMapPropertySourceWrapper重写了getProperty()方法,在获取配置值的时候,再做解密返回明文 
DefaultPropertyResolver 
	
		
			| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Override public String resolvePropertyValue(String value) {     return Optional.ofNullable(value)             .map(environment::resolvePlaceholders)             .filter(detector::isEncrypted)             .map(resolvedValue -> {                 try {                     // 获取密文                     String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());                     String resolvedProperty = environment.resolvePlaceholders(unwrappedProperty);                     // 执行解密操作                     return encryptor.decrypt(resolvedProperty);                 } catch (EncryptionOperationNotPossibleException e) {                     throw new DecryptionException("Unable to decrypt property: " + value + " resolved to: " + resolvedValue + ". Decryption of Properties failed,  make sure encryption/decryption " +                             "passwords match", e);                 }             })             .orElse(value); } |  三、Jasypt配置项Jasypt支持多种配置参数以进行密码、Digest认证、文本和对象的加密。以下是Jasypt支持的一些常见配置参数: 
	
		
			| 配置参数 | 描述 | 示例 |  
			| jasypt.encryptor.password | 加密器的密码,用于解密属性 | jasypt.encryptor.password=mySecretPassword |  
			| jasypt.encryptor.algorithm | 加密算法的名称 | jasypt.encryptor.algorithm=PBEWithMD5AndDES |  
			| jasypt.encryptor.keyObtentionIterations | 获取密钥时使用的迭代次数 | jasypt.encryptor.keyObtentionIterations=1000 |  
			| jasypt.encryptor.poolSize | 加密池的大小(如果使用了池化加密器) | jasypt.encryptor.poolSize=1 |  
			| jasypt.encryptor.providerName | 加密提供者的名称(如JCE提供者) | jasypt.encryptor.providerName=SunJCE |  
			| jasypt.encryptor.saltGeneratorClassName | 盐生成器的类名 | jasypt.encryptor.saltGeneratorClassName=org.jasypt.salt.RandomSaltGenerator |  
			| jasypt.encryptor.ivGeneratorClassName | 初始化向量生成器的类名 | jasypt.encryptor.ivGeneratorClassName=org.jasypt.iv.NoIvGenerator |  
			| jasypt.encryptor.stringOutputType | 加密字符串的输出类型(如base64) | jasypt.encryptor.stringOutputType=base64 |  
			| jasypt.encryptor.property.prefix | 加密属性前缀,用于识别加密属性 | jasypt.encryptor.property.prefix=ENC( |  
			| jasypt.encryptor.property.suffix | 加密属性后缀,用于识别加密属性 | jasypt.encryptor.property.suffix=) |  
			| jasypt.encryptor.proxyPropertySources | 是否通过代理截取属性值以进行解密 | jasypt.encryptor.proxyPropertySources=true |  注意: 
	这些参数主要用于配置Jasypt加密器(StringEncryptor)的行为。在实际使用中,特别是生产环境中,jasypt.encryptor.password等敏感信息不应该硬编码在配置文件中,而是通过环境变量、命令行参数或外部配置文件等方式安全地传递。Jasypt支持多种加密算法,如PBEWithMD5AndDES、PBEWithHMACSHA512ANDAES_256等,具体选择哪种算法取决于安全需求和环境配置。上述表格中的示例配置参数值仅为演示用途,实际使用时需要根据项目需求和安全策略进行配置。 四、支持的加密算法Jasypt支持多种加密算法以保护敏感数据。以下是Jasypt支持的一些常见加密算法: 
	
		
			| 加密算法名称 | 描述 |  
			| PBEWithMD5AndDES | 基于密码的加密(PBE),使用MD5作为散列函数和DES作为加密算法。这是一种较旧的加密算法,但在某些旧系统中可能仍在使用 |  
			| PBEWithMD5AndTripleDES | 与PBEWithMD5AndDES类似,但使用TripleDES作为加密算法,提供了更强的安全性。 |  
			| PBEWithHMACSHA512ANDAES_256 | 使用HMAC-SHA-512散列函数和AES-256加密算法的组合,提供了非常高的安全性。这是Jasypt较新版本中推荐的加密算法之一(默认值) |  
			| AES | 高级加密标准(AES),是一种广泛使用的对称加密算法。Jasypt支持不同长度的AES密钥,如AES-128、AES-192和AES-256 |  
			| RSA | Rivest-Shamir-Adleman(RSA)算法,是一种非对称加密算法。它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据 |  
 |