我正在尝试读取/打开使用PHP进行密码保护的.csv文件。 我显然有密码,并且在手动打开时确实有内容。 我尝试了此代码,它确实提取了文件,但是文件仍然为空。 我认为密码在.csv文件上,而不在.zip文件上,但是我不太确定。 谢谢 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
目前,我的spring-boot应用程序无需凭据即可连接到本地MongoDB。 为了能够在客户那里安装它,我需要提供使用用户名和密码进行数据库连接的功能。 我正在使用application.properties文件,该文件当前仅包含与数据库相关的以下3行:
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=myApp
还有另外两个:
spring.data.mongodb.username
spring.data.mongodb.password
但是,当然,我不想在此文件中使用纯文本格式的密码,甚至不希望在我们的git中使用该密码。 一种选择是为它们提供一个启动脚本作为参数,但是在过程细节中,它将再次作为纯文本读取。
我已经看到使用Jasypt在属性文件中进行了一些加密,但是我不了解这种方法在我的情况下如何工作。 我从来没有明确地使用这些属性,因为它们会被spring自动进行连接。
什么是最安全的方法?
这取决于您的安全性/风险配置文件,哪种方法可以接受。
您的问题是:最安全的方法是什么?
这个问题的简单答案不是将密码存储在任何地方,而是让操作员输入密码。显然,这不是您想要的答案,因为对于数据中心中的服务器甚至是云中的VM,这种方法都不可行。
要了解哪种方法足够安全,哪种方法可以接受,重要的是要了解您的组织环境,接受风险的意愿以及由此产生的后果,这是处理机密的必要条件。 评估可以得出结论,对于一个组织而言,可以很好地将凭据存储为纯文本格式(因为环境受到保护或与暴露的机密相关的威胁很小),而其他组织则需要使用适当的密钥管理和审核进行加密。
您已经在描述将凭证存储在Git中是不合适的选择。 因此,我假设您正在寻找一种以某种方式保护实际机密的方法。 保护可以在不同级别上进行:
潜在的可能性更多,但现在让我们继续使用。 与上述可能性相关联的一方面是凭证从源到目标目的地的传输。 传输通常跨越一个到多个参与方,并且这些参与方中的每一个都需要以某种方式得到信任(即,您必须确保某个参与方不会泄露您的凭据)。 这种模式也称为信任链。 如果信任链中的每一跳都是已知的,则不公开您的凭据,那么您可以对此上下文采取特定的保护模式。 如果您发现一个弱链接会增加暴露的风险(例如,公用文件夹,操作员查找),则您再次需要根据需要增加保护级别。
综上所述,让我们看一下使用Spring Boot应用秘密保护的可能性:
您可以使用环境变量或系统属性来存储配置。 波动性方面与持久性(例如,基于文件的)存储区分开来。 可以在应用程序启动之前/启动时设置变量。
环境变量示例:
export SPRING_DATA_MONGODB_USERNAME=…
export SPRING_DATA_MONGODB_PASSWORD=…
java -jar my-app.jar
系统属性示例:
java -jar my-app.jar -Dspring.data.mongodb.username=… -Dspring.data.mongodb.password=…
java -jar my-app.jar --spring.data.mongodb.username=… --spring.data.mongodb.password=…
请注意, /proc
文件系统和ps
工具可以对环境变量/命令行进行自检
有关更多详细信息,请参见有关外部化配置的参考文档。
Spring Cloud附带对单个属性的加密支持。 您可以使用不同的密钥和密钥类型(对称,非对称)来加密选定的属性。 这种方法使您可以选择应加密的属性,而无需加密整个文件。
环境变量示例:
application.properties
spring.data.mongodb.password={cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
请注意,此方法引入了属性密钥管理的要求。
有关更多详细信息,请参阅有关Spring Cloud Config加密和解密的参考文档。
Spring Boot中的配置属性是从Environment
获取的,并由PropertySource
提供。 在启动Spring Boot之前,您可以提供属性或整个PropertySource
。
添加PropertySource
示例:
SpringApplication app = new SpringApplication(DemoApplication.class);
app.addInitializers(new ApplicationContextInitializer<ConfigurableApplicationContext>() {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
applicationContext.getEnvironment().getPropertySources().addFirst(…);
}
});
app.run(args);
添加属性的示例:
SpringApplication app = new SpringApplication(DemoApplication.class);
app.setDefaultProperties(Collections.singletonMap("spring.data.mongodb.password", "…"));
app.run(args);
Spring Cloud Config允许您集中化由Spring Cloud Config Server服务的配置。 属性不再存储在本地,而是通过配置服务提供,该配置服务的安全性可以不同于应用程序保护级别。 要设置Spring Cloud Config Server,您需要额外的服务并将客户端依赖项集成到您的应用程序中。
请注意,这种方法并不能解决整体问题,而只是将其移交给其他人负责。
有关更多详细信息,请参见Spring Cloud Config Server上的参考文档。
如果您可以负担诸如HashiCorp Vault,CredHub,Azure KeyVault,Kubernetes Secrets之类的Secrets Management,则可以利用平台/秘密管理系统的功能对凭据进行保护。
机密管理系统通常为您处理加密,审核和访问控制。 这些系统保留凭证的加密副本。 一旦您请求了凭证(通常通过TLS安全连接),系统就会检查您/您的应用程序是否被允许访问该机密。
其中一些系统还提供动态机密。 根据需要为特定的应用程序实例生成动态机密。 如果您的应用程序要连接到MongoDB,则秘密管理系统将创建一个凭据对并将其存储到您的应用程序中。 当您的应用程序停止时,秘密管理系统将撤消凭据。
有关更多详细信息,请参见Spring Cloud Vault上的参考文档。
@ mp911de的答案的一个附录:
Spring Boot中还有第二个文件选项:您可以通过向文件提供ENV变量SPRING_CONFIG_ADDITIONAL_LOCATION
或将其添加为命令属性(例如spring.config.additional-location
来提供一个覆盖标准配置的附加文件。请参阅应用程序属性文件 。
这可能使您有机会通过某些文件秘密部署(例如,用作volumeMount的Kubernetes秘密,基于Puppet / Chef / Ansible的秘密部署等)来添加凭据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.