我有一个包含数据库用户名/密码的属性文件,我用它来管理与数据库的ibatis连接。
加密此属性文件以确保安全的最佳方法是什么。 实际上我使用的是netbeans 6.8。有没有办法在为项目打包时加密此属性文件,或以其他任何方式阻止其他人查看数据库凭据?
我正在使用ibatis连接到java桌面应用程序中的数据库
任何帮助都将不胜感激。
感谢
答案 0 :(得分:1)
您是想删除诱惑还是让用户无法找到手动连接数据库的用户名/密码?
如果您只想删除诱惑,可以在课程中加密文件。 MyBatis(我看到你标记了你的问题mybatis
和ibatis
所以我假设我的代码中的MyBatis )没有提供使用加密凭据的开箱即用方式,但您可以干预使用凭据的代码并在那里进行解密。您只需创建自定义数据源工厂。
假设您有这样的数据源:
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://someServer/someDB" />
<property name="username" value="${user}" />
<property name="password" value="${password}" />
</dataSource>
使用键的属性文件:
user=JohnDoe
password=p@$$word
您可以对文件进行加密,然后创建一个自定义数据源工厂(确保扩展正确的工厂:池化,非池化等):
package com.test;
import java.util.Properties;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
public class CustomDataSourceFactory extends UnpooledDataSourceFactory {
@Override
public void setProperties(Properties properties) {
String user = null;
String pass = null;
// decrypt the file, use some fancy obfuscation, connect somewhere to get
// the username and password dynamically at startup, whatever...
//
// user = "JohnDoe";
// pass = "p@$$word";
properties.put("username", user);
properties.put("password", pass);
super.setProperties(properties);
}
}
您的数据源将更改为:
<dataSource type="com.test.CustomDataSourceFactory">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://someServer/someDB" />
</dataSource>
现在用户再也看不到凭据了。
但请注意上述内容不会保护用户名/密码。无论你选择什么来消除诱惑(加密,混淆,一些复杂的算法等),事情就是你的用户拥有他在机器上反转过程所需的一切(解密密钥,解压缩归档) ,反编译代码,逆向工程等)。
要使其无法检索用户名/密码,请将iBatis / myBatis移至应用程序服务器;即将您的thick client转换为thinner。您获得了Windows应用程序和数据库之间的分离。您的应用程序服务器将根据Windows应用程序收到的命令运行所有数据库查询。
在这种情况下,Windows应用程序将不再运行查询本身,因此根本不需要数据库凭据;数据库凭据将存储在应用程序服务器上。
答案 1 :(得分:0)
您是否在网络应用程序中使用IBatis?如果是这样,您应该在Web容器中设置数据库访问详细信息,而不是应用程序。然后,您的应用程序将通过容器(Tomcat,GlassFish,Websphere等)访问数据库,并且不关心安全性。
您基本上想要设置JNDI数据源 - 存在于容器框架而不是您的应用程序中的东西。如果我能提供帮助,我不希望在属性文件中使用数据库访问详细信息。
答案 2 :(得分:0)
无论你做什么,请记住,要加密密码,你需要一个密钥,你必须将密钥存储在某个地方。您选择用于加密的任何解决方案都是这种情况,也适用于应用程序服务器。
这意味着应该以某种方式考虑关键安全性,例如:可以在UNIX帐户级别或类似的地方设置安全性。
这里是加密数据并生成密钥的代码的好例子:
http://exampledepot.com/egs/javax.crypto/DesString.html
以下是如何从文件中保存加载密钥:
答案 3 :(得分:0)