春季启动如何在属性文件中隐藏密码
Spring Boot 使用属性文件,至少在默认情况下,密码是纯文本格式。是否有可能以某种方式隐藏/解密这些?
Spring Boot 使用属性文件,至少在默认情况下,密码是纯文本格式。是否有可能以某种方式隐藏/解密这些?
您可以使用 Jasypt 来加密属性,因此您的属性可以如下所示:
db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=)
Jasypt允许您使用不同的算法加密您的属性,一旦您获得加密的属性,您就放在.例如,您可以使用终端通过Jasypt以这种方式进行加密:ENC(...)
encrypted-pwd$ java -cp ~/.m2/repository/org/jasypt/jasypt/1.9.2/jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="contactspassword" password=supersecretz algorithm=PBEWithMD5AndDES
----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 24.45-b08
----ARGUMENTS-------------------
algorithm: PBEWithMD5AndDES
input: contactspassword
password: supersecretz
----OUTPUT----------------------
XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=
要使用Spring Boot轻松配置它,您可以使用其带有组ID的启动器jasypt-spring-boot-startercom.github.ulisesbocchio
请记住,您需要使用用于加密属性的相同密码启动应用程序。因此,你可以通过以下方式启动应用:
mvn -Djasypt.encryptor.password=supersecretz spring-boot:run
或者使用环境变量(由于弹簧启动松弛绑定):
export JASYPT_ENCRYPTOR_PASSWORD=supersecretz
mvn spring-boot:run
您可以查看以下链接以获取更多详细信息:
https://www.ricston.com/blog/encrypting-properties-in-spring-boot-with-jasypt-spring-boot/
要在应用程序中使用加密属性,只需像往常一样使用它,请使用您喜欢的任何一种方法(Spring Boot连接魔术,无论如何,该属性当然必须在类路径中):
使用批注@Value
@Value("${db.password}")
private String password;
或使用Environment
@Autowired
private Environment environment;
public void doSomething(Environment env) {
System.out.println(env.getProperty("db.password"));
}
更新:对于生产环境,为了避免在命令行中公开密码,因为您可以使用,以前的命令等查询进程。您可以:ps
history
touch setEnv.sh
setEnv.sh
JASYPT_ENCRYPTOR_PASSWORD
#!/bin/bash
导出JASYPT_ENCRYPTOR_PASSWORD=超秒
. setEnv.sh
mvn spring-boot:run &
setEnv.sh
unset JASYPT_ENCRYPTOR_PASSWORD
对于已经提出的解决方案,我可以添加一个选项来配置外部(如Vault)Secrets Manager
vault server -dev
)vault write secret/somename key1=value1 key2=value2
vault read secret/somename
将以下依赖项添加到您的 SpringBoot 项目中:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
添加库配置属性:
spring.cloud.vault.host=localhost
spring.cloud.vault.port=8200
spring.cloud.vault.scheme=http
spring.cloud.vault.authentication=token
spring.cloud.vault.token=${VAULT_TOKEN}
作为环境变量传递。VAULT_TOKEN
请参阅此处的文档。
有一个Spring Vault项目,也可用于访问,存储和撤销机密。
屬地:
<dependency>
<groupId>org.springframework.vault</groupId>
<artifactId>spring-vault-core</artifactId>
</dependency>
配置库模板:
@Configuration
class VaultConfiguration extends AbstractVaultConfiguration {
@Override
public VaultEndpoint vaultEndpoint() {
return new VaultEndpoint();
}
@Override
public ClientAuthentication clientAuthentication() {
return new TokenAuthentication("…");
}
}
注入和使用库模板:
public class Example {
@Autowired
private VaultOperations operations;
public void writeSecrets(String userId, String password) {
Map<String, String> data = new HashMap<String, String>();
data.put("password", password);
operations.write(userId, data);
}
public Person readSecrets(String userId) {
VaultResponseSupport<Person> response = operations.read(userId, Person.class);
return response.getBody();
}
}
使用保险柜 :PropertySource
@VaultPropertySource(value = "aws/creds/s3",
propertyNamePrefix = "aws."
renewal = Renewal.RENEW)
public class Config {
}
用法示例:
public class S3Client {
// inject the actual values
@Value("${aws.access_key}")
private String awsAccessKey;
@Value("${aws.secret_key}")
private String awsSecretKey;
public InputStream getFileFromS3(String filenname) {
// …
}
}