加密Ibatis的属性文件

时间:2011-12-15 08:15:20

标签: java swing ibatis netbeans6.8 mybatis

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

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

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

任何帮助都将不胜感激。

感谢

4 个答案:

答案 0 :(得分:1)

您是想删除诱惑还是让用户无法找到手动连接数据库的用户名/密码?

如果您只想删除诱惑,可以在课程中加密文件。 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>

现在用户再也看不到凭据了。

但请注意上述内容不会保护用户名/密码。无论你选择什么来消除诱惑(加密,混淆,一些复杂的算法等),事情就是你的用户拥有他在机器上反转过程所需的一切(解密密钥,解压缩归档) ,反编译代码,逆向工程等)。

使其无法检索用户名/密码,请将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

以下是如何从文件中保存加载密钥:

http://www.java2s.com/Code/Java/Security/TripleDES.htm

答案 3 :(得分:0)

我也在搜索保护Database.properties文件的相同问题,并找到了一个简单的方法:
如果您知道应用程序的用户将连接到互联网而不使用加密解密,则只需在任何可以为您提供两个主要属性的免费文件托管站点上托管您的属性文件:

  1. 可以为您提供文件的直接链接。
  2. 并且,它可以为您提供在需要更改时编辑同一文件的工具。
  3. 我使用的解决方案之一是Dropbox,您可以观看使用其公用文件夹属性Here的教程 ...希望能解决你的问题解决我的问题:)