保护属性文件中的密码

2022-08-31 13:41:49

我有一个连接到数据库的java应用程序。
数据库的用户名和密码存储在属性文件中。
避免在属性文件中以明文形式存储密码,同时仍保留允许用户更改密码的选项时,通常的做法是什么?
这里的主要动机是防止有人在管理员编辑属性文件时查看管理员的肩膀并看到密码。
我在这里读到,有一个内置的方法可以在C#中做到这一点。
了解Java,我不期望找到一个内置的解决方案,但我想听听其他人在做什么。
如果我没有找到任何好的选择,那么我可能会用一个将保存在代码中的恒定密码对其进行加密。但我讨厌这样做,因为它感觉不对劲。

编辑2012年12月12日看起来没有魔法,我必须将密码存储在代码或类似的东西中。最后,我们实现了与其中一个答案中提到的Jasypt非常相似的东西。所以我接受Jasypt的答案,因为它是最接近明确答案的东西。


答案 1

enter image description here

Jasypt 提供了 org.jasypt.properties.EncryptableProperties 类,用于加载、管理和透明地解密 .properties 文件中的加密值,从而允许在同一文件中混合使用加密值和非加密值。

http://www.jasypt.org/encrypting-configuration.html

通过使用 org.jasypt.properties.EncryptableProperties 对象,应用程序将能够正确读取和使用 .properties 文件,如下所示:

datasource.driver=com.mysql.jdbc.Driver 
datasource.url=jdbc:mysql://localhost/reportsdb 
datasource.username=reportsUser 
datasource.password=ENC(G6N718UuyPE5bHyWKyuLQSm02auQPUtm) 

请注意,数据库密码是加密的(实际上,任何其他属性也可以加密,无论它是否与数据库配置相关)。

我们如何读取此值?喜欢这个:

/*
* First, create (or ask some other component for) the adequate encryptor for   
* decrypting the values in our .properties file.   
*/  
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();     
encryptor.setPassword("jasypt"); // could be got from web, env variable...    
/*   
* Create our EncryptableProperties object and load it the usual way.   
*/  
Properties props = new EncryptableProperties(encryptor);  
props.load(new FileInputStream("/path/to/my/configuration.properties"));

/*   
* To get a non-encrypted value, we just get it with getProperty...   
*/  
String datasourceUsername = props.getProperty("datasource.username");

/*   
* ...and to get an encrypted value, we do exactly the same. Decryption will   
* be transparently performed behind the scenes.   
*/ 
String datasourcePassword = props.getProperty("datasource.password");

 // From now on, datasourcePassword equals "reports_passwd"...

答案 2

穷人的妥协解决方案是使用简单的多重签名方法。

例如,DBA 将应用程序数据库密码设置为 50 个字符的随机字符串。TAKqWskc4ncvKaJTyDcgAHq82X7tX6GfK2fc386bmNw3muknjU

他或她将一半的密码交给应用程序开发人员,然后应用程序开发人员将其硬编码到java二进制文件中。

private String pass1 = “TAKqWskc4ncvKaJTyDcgAHq82”

密码的另一半作为命令行参数传递。DBA 将 pass2 提供给系统支持人员或管理员,他们要么输入应用程序启动时间,要么将其放入自动应用程序启动脚本中。

java -jar /myapplication.jar -pass2 X7tX6GfK2fc386bmNw3muknjU

当应用程序启动时,它使用 pass1 + pass2 并连接到数据库。

该解决方案具有许多优点,而没有提到的缺点。

您可以安全地将一半的密码放在命令行参数中,因为除非您是拥有另一半密码的开发人员,否则阅读它不会对您有太大帮助。

DBA 仍然可以更改密码的后半部分,开发人员不必重新部署应用程序。

源代码也可以是半公开的,因为读取它,密码不会给你的应用程序访问权限。

您可以通过对数据库将从中接受连接的 IP 地址范围添加限制来进一步改善这种情况。