我在java中有一个属性文件,我存储了我的应用程序的所有信息,如徽标图像文件名,数据库名称,数据库用户和数据库密码。
我可以将加密的密码存储在属性文件中
但是,可以使用反编译器从jar中读出密钥或密码
有没有办法安全地将db传递存储在属性文件中?
答案 0 :(得分:3)
有多种方法可以解决这个问题。如果您可以找到一种方法让用户在应用程序启动时为密钥库提供密码,最合适的方法是使用密钥加密所有值,并将此密钥存储在密钥库中。密钥库的命令行界面是使用keytool。但是,JSE还具有以编程方式访问密钥库的API。
如果您无法让用户在启动时手动为密钥库提供密码(例如对于Web应用程序),那么一种方法是编写一个异常复杂的混淆例程,该例程可以对密钥进行模糊处理。也将它存储在属性文件中。要记住的重要事项是混淆和反混淆逻辑应该是多层的(可能涉及加扰,编码,引入虚假字符等等)并且本身应该至少有一个密钥可以隐藏在应用程序的其他类中使用非直观的名字。这不是一个完全安全的机制,因为有反编译器和相当数量的时间和智能的人仍然可以解决它但是我所知道的唯一一个不要求你闯入本机(即不易解密)的代码
答案 1 :(得分:2)
您可以在属性文件中存储密码的SHA1哈希值。然后,当您验证用户密码时,您将对其登录尝试进行哈希处理,并确保两个哈希值匹配。
这是为您散列一些字节的代码。您可以使用getBytes()
方法轻松地从字符串中生成字节。
/**
* Returns the hash value of the given chars
*
* Uses the default hash algorithm described above
*
* @param in
* the byte[] to hash
* @return a byte[] of hashed values
*/
public static byte[] getHashedBytes(byte[] in)
{
MessageDigest msg;
try
{
msg = MessageDigest.getInstance(hashingAlgorithmUsed);
}
catch (NoSuchAlgorithmException e)
{
throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist. Epic fail, go change it in the Util file. SHA(1) or MD5");
}
msg.update(in);
return msg.digest();
}
答案 2 :(得分:1)
不,没有。即使你对它进行加密,也会有人反编译解密它的代码。
答案 3 :(得分:0)
您可以为密码(直接数据库密码或密钥密码)创建一个单独的属性文件(在jar之外),并且不包含具有该分发的属性文件。或者您可以使服务器仅接受来自特定计算机的登录,以便需要进行欺骗。
答案 4 :(得分:0)
除了如上所述加密密码外,还要将任何密码放在单独的属性文件中,并在部署时尽量为此文件提供最多的锁定权限。
例如,如果您的Application Server在Linux / Unix上以root
运行,则使root
拥有的密码属性文件具有400 / -r--------
权限。
答案 5 :(得分:0)
当然,在通过某种方式进行身份验证后,您是否有应用程序通过https联系服务器并下载密码?