我有一个包含数据库用户名/密码的属性文件,我用它来管理 ibatis 与数据库的连接。
加密此属性文件以确保安全的最佳方法是什么。 实际上我使用的是 netbeans 6.8。有没有办法在为项目打包时加密这个属性文件,或者任何其他方式来防止其他人看到数据库凭据?
我正在使用 ibatis 连接到 java 桌面应用程序中的数据库
如有任何帮助,我们将不胜感激。
谢谢
最佳答案
是否要去除诱惑或让用户无法找到用户名/密码来手动连接数据库?
如果您只是想消除诱惑,当然可以加密文件。 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>
现在用户再也看不到凭据了。
但请注意,以上不会保护用户名/密码。无论你选择什么来消除诱惑(加密、混淆、一些复杂的算法等),问题是你的用户拥有他需要的一切来在他的机器上逆转这个过程(解密 key ,提取存档、反编译代码、逆向工程等)。
为了无法找回用户名/密码,把iBatis/myBatis移到一个应用服务器上;即转换你的 thick client进入 thinner一。您获得了 Windows 应用程序和数据库之间的解耦。您的应用程序服务器将根据 Windows 应用程序收到的命令运行所有数据库查询。
在这种情况下,Windows 应用程序将不再运行查询本身,因此它根本不需要数据库凭据;数据库凭据将存储在应用程序服务器上。
关于java - 为 Ibatis 加密一个属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8516989/