【SpringBoot3】使用Jasypt加密数据库用户名、密码等敏感信息 ...

打印 上一主题 下一主题

主题 551|帖子 551|积分 1653

一、使用步骤介绍

使用Jasypt(Java Simplified Encryption)举行数据加密息争密主要涉及几个步骤,包括引入依靠、设置加密密码、加密敏感信息、将加密信息存储到设置文件中,以及应用程序启动时自动解密。以下是具体的使用阐明:
1. 引入依靠

首先,你必要在你的项目中引入Jasypt的依靠。如果你是使用Maven构建项目,可以在pom.xml文件中添加如下依靠(注意版本号大概随时间更新,请参考最新版本):
  1. <dependency>
  2.     <groupId>com.github.ulisesbocchio</groupId>
  3.     <artifactId>jasypt-spring-boot-starter</artifactId>
  4.     <version>3.0.5</version>
  5. </dependency>
复制代码
可根据必要更换成最新的版本号。
2. 设置加密密码

Jasypt必要一个密码来举行加密息争密操作。你可以通过以下几种方式设置这个密码:


  • 在设置文件中指定:在你的application.properties或application.yml设置文件中,添加jasypt.encryptor.password设置项,并设置你的密码。例如:
    1. # application.properties
    2. jasypt.encryptor.password=your_encryption_password
    复制代码
    或者,在application.yml中:
    1. jasypt:
    2.   encryptor:
    3.     password: your_encryption_password
    复制代码
    然而,将密码直接写在设置文件中大概存在安全风险。因此,更保举的做法是通过启动参数或环境变量来传递这个密码。
  • 通过启动参数指定:在启动应用程序时,可以通过-Djasypt.encryptor.password=your_encryption_password参数来指定加密密码。
  • 使用环境变量:在某些环境下,使用环境变量来存储敏感信息(如加密密码)大概更为安全。具体方法取决于你的应用程序部署环境。
3. 加密敏感信息

在设置加密密码后,你可以使用Jasypt提供的工具或API来加密你的敏感信息。加密后的信息将以密文形式存储。


  • 使用Jasypt CLI工具:Jasypt提供了一个命令行界面(CLI)工具,允许你在命令行中加密息争密字符串。你必要下载Jasypt的jar包,并在命令行中运行相应的命令。
  • 使用Jasypt API:在你的Java应用程序中,你可以通过注入StringEncryptor接口的实现类来编程方式加密息争密字符串。这通常在你的Spring Boot应用程序中通过自动装配完成。
4. 将加密信息存储到设置文件中

加密敏感信息后,你必要将这些加密后的信息存储到设置文件中。在Jasypt中,加密后的信息通常以ENC(...)的形式出现,括号内是加密后的密文。例如:
  1. # application.properties
  2. 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. public class JasyptSecretTest {
  2.     @Autowired
  3.     private StringEncryptor stringEncryptor;
  4.     @Value("${datasource.password}")
  5.     private String password;
  6.     @Test
  7.     public void encrypt(){
  8.         // 加密
  9.         String encrypt = stringEncryptor.encrypt("root");
  10.         System.out.println("encrypt = " + encrypt);
  11.     }
  12. }
复制代码
2、在application.properties 中增加设置密文
  1. # 加密后的密文,包裹在ENC() 中datasource.password=ENC(grdksstYZMsPmwvA0ALHXpzBQN2YTyA3t4ow1PDfJzbl+UV0LdO8UlajWKeqUF7y)# 用于加密的密码
  2. jasypt.encryptor.password=123456
复制代码
3、使用 @Value() 获取明文,也可以通过stringEncryptor.decrypt(encrypt)手动解密
  1. @SpringBootTest
  2. public class JasyptSecretTest {
  3.     @Autowired
  4.     private StringEncryptor stringEncryptor;
  5.     @Value("${datasource.password}")
  6.     private String password;
  7.     @Test
  8.     public void encrypt(){
  9.         // 加密
  10.         String encrypt = stringEncryptor.encrypt("root");
  11.         System.out.println("encrypt = " + encrypt);
  12.         // 解密,输入获取的加密字符串进行解密
  13.         String decrypt = stringEncryptor.decrypt(encrypt);
  14.         System.out.println("decrypt = " + decrypt);
  15.     }
  16.     @Test
  17.     public void show(){
  18.         System.out.println("password = " + password);
  19.     }
  20. }
复制代码
原理阐明

SpringBoot项目在启动过程中,会自动注入beanStringEncryptor,用于根据不同的加密算法初始化不同的加解密实现类,通过StringEncryptorBuilder.build()初始化不同的加密算法
   BeanNamePlaceholderRegistryPostProcessor
  1. @Bean(name = ENCRYPTOR_BEAN_NAME)
  2. public StringEncryptor stringEncryptor(
  3.         final EnvCopy envCopy,
  4.         final BeanFactory bf) {
  5.     final String customEncryptorBeanName = envCopy.get().resolveRequiredPlaceholders(ENCRYPTOR_BEAN_PLACEHOLDER);
  6.     final boolean isCustom = envCopy.get().containsProperty(ENCRYPTOR_BEAN_PROPERTY);
  7.     return new DefaultLazyEncryptor(envCopy.get(), customEncryptorBeanName, isCustom, bf);
  8. }
复制代码
通过EncryptableMapPropertySourceWrapper重写了getProperty()方法,在获取设置值的时候,再做解密返回明文
   DefaultPropertyResolver
  1. @Override
  2. public String resolvePropertyValue(String value) {
  3.     return Optional.ofNullable(value)
  4.             .map(environment::resolvePlaceholders)
  5.             .filter(detector::isEncrypted)
  6.             .map(resolvedValue -> {
  7.                 try {
  8.                     // 获取密文
  9.                     String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());
  10.                     String resolvedProperty = environment.resolvePlaceholders(unwrappedProperty);
  11.                     // 执行解密操作
  12.                     return encryptor.decrypt(resolvedProperty);
  13.                 } catch (EncryptionOperationNotPossibleException e) {
  14.                     throw new DecryptionException("Unable to decrypt property: " + value + " resolved to: " + resolvedValue + ". Decryption of Properties failed,  make sure encryption/decryption " +
  15.                             "passwords match", e);
  16.                 }
  17.             })
  18.             .orElse(value);
  19. }
复制代码
三、Jasypt设置项

Jasypt支持多种设置参数以举行密码、Digest认证、文本和对象的加密。以下是Jasypt支持的一些常见设置参数:
设置参数描述示例jasypt.encryptor.password加密器的密码,用于解密属性jasypt.encryptor.password=mySecretPasswordjasypt.encryptor.algorithm加密算法的名称jasypt.encryptor.algorithm=PBEWithMD5AndDESjasypt.encryptor.keyObtentionIterations获取密钥时使用的迭代次数jasypt.encryptor.keyObtentionIterations=1000jasypt.encryptor.poolSize加密池的巨细(如果使用了池化加密器)jasypt.encryptor.poolSize=1jasypt.encryptor.providerName加密提供者的名称(如JCE提供者)jasypt.encryptor.providerName=SunJCEjasypt.encryptor.saltGeneratorClassName盐生成器的类名jasypt.encryptor.saltGeneratorClassName=org.jasypt.salt.RandomSaltGeneratorjasypt.encryptor.ivGeneratorClassName初始化向量生成器的类名jasypt.encryptor.ivGeneratorClassName=org.jasypt.iv.NoIvGeneratorjasypt.encryptor.stringOutputType加密字符串的输出类型(如base64)jasypt.encryptor.stringOutputType=base64jasypt.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-256RSARivest-Shamir-Adleman(RSA)算法,是一种非对称加密算法。它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据 参考资料



  • https://github.com/ulisesbocchio/jasypt-spring-boot

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表