你是否还是这样,简单粗暴的把数据库用户名、密码等敏感信息写在配置文件中?那你又是否曾经考虑过其中的安全性问题?

spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false
username: root
password: 123456

如果有的话,那下面来看看,如何通过使用 Jasypt Spring Boot ,以更加优雅的方式来规避这种操作。

  • 相关依赖
  <dependencies>
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
  • 完善配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&tinyInt1isBit=false
# 对应用户名 root ,密码 123456
username: ENC[KHRM9dKY8KykzzYbt8rRZQ==]
password: ENC[RWmQMxlcukotJAb36PrKSA==]

jasypt:
encryptor:
# 任意的随机字符串均可
password: SBPstLlrFzXW01Okb62R95qvpj4J83Dn
property:
# 自定义属性规则,默认前缀是“ENC(”,后缀为“)”
prefix: "ENC["
suffix: "]"

留意到上面这段配置的用户名和密码是 ENC[xxx] 这种格式的,其中 ENC[] 是自定义配置的,这也是 Jasypt 能正常识别待解密数据的规则,那其中的加密串又是从哪来的呢?

当然是运算出来的。最简单的配置,开发者只需要再补充完 jasypt.encryptor.password=xxx 属性即可(同上,还支持使用 DER、PEM 这种证书的 private/public keys 加解密方式),具体的生成代码在下方:

@Slf4j
@SpringBootApplication
@EnableEncryptableProperties
public class JasyptSpringBootApplication {

public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(JasyptSpringBootApplication.class, args);
JasyptSpringBootApplication application = context.getBean(JasyptSpringBootApplication.class);
// 这里可以将明文(用户名、密码)转换成相应密文
application.jasypt("root");
application.jasypt("123456");

// 不过程序最后还是通过明文信息进行数据库连接
HikariDataSource hikariDataSource = (HikariDataSource) context.getBean(DataSource.class);
log.info("DB username: {} , password: {}", hikariDataSource.getUsername(), hikariDataSource.getUsername());
}

@Resource
private StringEncryptor stringEncryptor;

public void jasypt(String text) {
// 即使是相同明文,但这里每次生成的都是不同的密文
String encryptedText = stringEncryptor.encrypt(text.trim());
String decryptedText = stringEncryptor.decrypt(encryptedText);
log.info("ORIGINAL: {} ; ENCRYPTED: {} ; DECRYPTED: {}", text, encryptedText, decryptedText);
}

}

相关链接

jasypt-spring-boot
jasypt-spring-boot-samples

示例源码
欢迎关注我的个人公众号:超级码里奥
如果这对您有帮助,欢迎点赞和分享,转载请注明出处

最后更新: 2019年04月13日 14:00

原始链接: https://blog.mariojd.cn/jasypt-spring-boot-example.html

× 支持创作
打赏二维码