Spring Boot 使用属性文件,至少默认情况下,密码是纯文本的。是否有可能以某种方式隐藏/解密这些?
原文由 user1340582 发布,翻译遵循 CC BY-SA 4.0 许可协议
Spring Boot 使用属性文件,至少默认情况下,密码是纯文本的。是否有可能以某种方式隐藏/解密这些?
原文由 user1340582 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于已经提出的解决方案,我可以添加一个选项来配置外部 Secrets Manager
例如 Vault 。
vault server -dev
( 仅适用于 DEV,不适用于 PROD )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>
添加 Vault 配置属性:
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>
配置 Vault 模板:
@Configuration
class VaultConfiguration extends AbstractVaultConfiguration {
@Override
public VaultEndpoint vaultEndpoint() {
return new VaultEndpoint();
}
@Override
public ClientAuthentication clientAuthentication() {
return new TokenAuthentication("…");
}
}
注入并使用 VaultTemplate:
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();
}
}
使用 Vault 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) {
// …
}
}
原文由 J-Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
您可以使用 Jasypt 加密属性,因此您可以拥有这样的属性:
Jasypt 允许您使用不同的算法加密您的属性,一旦您获得放入
ENC(...)
的加密属性。例如,您可以使用终端通过 Jasypt 以这种方式加密:要使用 Spring Boot 轻松配置它,您可以使用其启动器 jasypt-spring-boot-starter 和组 ID
com.github.ulisesbocchio
请记住,您需要使用与加密属性相同的 密码 来启动应用程序。因此,您可以通过以下方式启动您的应用程序:
或者使用环境变量(感谢 spring boot 宽松绑定):
您可以查看以下链接以获取更多详细信息:
https://www.ricston.com/blog/encrypting-properties-in-spring-boot-with-jasypt-spring-boot/
要在您的应用程序中使用您的加密属性,只需像往常一样使用它,使用您喜欢的任何一种方法(Spring Boot 具有魔力,无论如何属性必须当然在类路径中):
使用
@Value
注解或使用
Environment
更新:对于生产环境,为了避免在命令行中暴露密码,因为您可以使用 --- 查询进程,使用
ps
history
之前的命令。您可以:touch setEnv.sh
setEnv.sh
以导出JASYPT_ENCRYPTOR_PASSWORD
变量. setEnv.sh
执行文件mvn spring-boot:run &
在后台运行应用程序setEnv.sh
unset JASYPT_ENCRYPTOR_PASSWORD