java - 为 Ibatis 加密一个属性文件

标签 java swing ibatis netbeans6.8 mybatis

我有一个包含数据库用户名/密码的属性文件,我用它来管理 ibatis 与数据库的连接。

加密此属性文件以确保安全的最佳方法是什么。 实际上我使用的是 netbeans 6.8。有没有办法在为项目打包时加密这个属性文件,或者任何其他方式来防止其他人看到数据库凭据?

我正在使用 ibatis 连接到 java 桌面应用程序中的数据库

如有任何帮助,我们将不胜感激。

谢谢

最佳答案

是否要去除诱惑或让用户无法找到用户名/密码来手动连接数据库?

如果您只是想消除诱惑,当然可以加密文件。 MyBatis(我看到你标记了你的问题 mybatisibatis 所以我假设我的代码中有 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/

相关文章:

java - 我需要为 org.apache.http.client.HttpClient 的 execute() 设置什么?

java - TreeMap 自定义比较器

java - Microsoft Azure Cosmos DocumentDB 最佳读取查询性能

Java JFrame 项目位置/大小

java - 控制 Mac 上 JButton 的外观

java - 如何使用 iBatis

java - 将 Java Web 应用程序连接到 Oracle 数据库

java - 在myBatis中调用java方法生成SQL查询

java - 保留特殊字符的replaceAll类型方法

java - Swing:将值从预定线程传回 UI