Spring Boot如何在属性文件中隐藏密码

新手上路,请多包涵

Spring Boot 使用属性文件,至少默认情况下,密码是纯文本的。是否有可能以某种方式隐藏/解密这些?

原文由 user1340582 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

您可以使用 Jasypt 加密属性,因此您可以拥有这样的属性:

 db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=)

Jasypt 允许您使用不同的算法加密您的属性,一旦您获得放入 ENC(...) 的加密属性。例如,您可以使用终端通过 Jasypt 以这种方式加密:

 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 轻松配置它,您可以使用其启动器 jasypt-spring-boot-starter 和组 ID com.github.ulisesbocchio

请记住,您需要使用与加密属性相同的 密码 来启动应用程序。因此,您可以通过以下方式启动您的应用程序:

 mvn -Djasypt.encryptor.password=supersecretz spring-boot:run

或者使用环境变量(感谢 spring boot 宽松绑定):

 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=supersecretz

  • . setEnv.sh 执行文件
  • 使用 mvn spring-boot:run & 在后台运行应用程序
  • 删除文件 setEnv.sh
  • 取消设置以前的环境变量: unset JASYPT_ENCRYPTOR_PASSWORD

原文由 Federico Piazza 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于已经提出的解决方案,我可以添加一个选项来配置外部 Secrets Manager 例如 Vault

  1. 配置 Vault 服务器 vault server -dev仅适用于 DEV,不适用于 PROD
  2. 写秘密 vault write secret/somename key1=value1 key2=value2
  3. 验证秘密 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题