如何在命令中隐藏密码";java-Djasypt.encryptor.password=somepassword-jarname.jar";

如何在命令中隐藏密码";java-Djasypt.encryptor.password=somepassword-jarname.jar";,java,spring-boot,password-encryption,jasypt,Java,Spring Boot,Password Encryption,Jasypt,我正在使用Jasypt加密并在属性文件的ENC()中指定属性值。解密密码通过命令行参数发送,如下所示java-djastpt.encryptor.password=somepassword-jarname.jar。一切正常,但问题是当我搜索正在运行的进程时,它也会显示密码。有没有办法通过从某处读取来隐藏加密密码 我曾想过使用环境变量,但这也可能会暴露密码。所以,我决定反对 更新: 在另一个SO帖子中有一个解决方案 我遵循的解决方案是创建一个名为JASYPT\u ENCRYPTOR\u PASS

我正在使用Jasypt加密并在属性文件的ENC()中指定属性值。解密密码通过命令行参数发送,如下所示
java-djastpt.encryptor.password=somepassword-jarname.jar
。一切正常,但问题是当我搜索正在运行的进程时,它也会显示密码。有没有办法通过从某处读取来隐藏加密密码

我曾想过使用环境变量,但这也可能会暴露密码。所以,我决定反对

更新: 在另一个SO帖子中有一个解决方案


我遵循的解决方案是创建一个名为
JASYPT\u ENCRYPTOR\u PASSWORD
的环境变量,执行命令
java-jar name.jar
,然后取消设置环境变量。这正是我的初衷。

您完全可以使用Jasypt读取存储在属性文件中的
EncryptableProperties
,如下所示:

datasource.username=reportsUser 
datasource.password=ENC(G6N718UuyPE5bHyWKyuLQSm02auQPUtm) 
然后您可以从程序中检索属性(加密和非加密):

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();     
encryptor.setPassword("jasypt"); // could be got from web, env variable...    

Properties props = new EncryptableProperties(encryptor);  
props.load(new FileInputStream("/path/to/my/configuration.properties"));

String datasourceUsername = props.getProperty("datasource.username");

String datasourcePassword = props.getProperty("datasource.password");
请注意,在上面的示例中,未加密和加密属性的检索方式相同,而Jasypt自动处理解密/加密

以下是相关Jasypt文档的链接:

这里有一个类似的问题,还有更多细节:

我遵循的解决方案是创建一个名为JASYPT_ENCRYPTOR_PASSWORD的环境变量,执行命令java-jar name.jar,然后取消设置环境变量。这正是我想要的

在短时间内设置环境变量与否无关紧要,这不是一个好主意。即使是最短的时间也足以让攻击者访问它。也存在类似的攻击,其中可以预测临时文件的名称,并允许攻击者创建具有该名称的链接,例如访问/etc/passwd文件等

这个问题已经存在了一段时间,因此已经有了两种解决方案,其中大多数都使用包含密码的文件或用于加密和解密敏感数据的密钥存储


例如,如果你看JBoss,他们使用一种叫做保险库的东西。这里有一个简单的步骤说明。您可以为您的应用程序重新创建所有这些内容,或者从指定文件名的文件中读取纯文本密码,例如,作为系统属性。文件本身必须在文件系统级别(仅为所有者设置读取权限)以及(如有必要)在应用程序中设置
SecurityManager
,以防止未经授权的访问,该类拒绝用于读取该文件的其他类访问该文件。这是与安全相关的应用程序(如或)的常见做法。

echo password | java….
然后读取它,而不是获取属性。请记住在从JVM使用后清除它,否则堆转储可能会显示它