зашифровать файл свойств для Ibatis - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть файл свойств, содержащий имя пользователя / пароль базы данных, который я использовал для управления подключением ibatis к базе данных.

Каков наилучший способ шифрования этого файла свойств для обеспечения безопасности.На самом деле я использую NetBeans 6,8.Есть ли способ зашифровать этот файл свойств при создании упаковки для проекта или любой другой способ запретить другим пользователям видеть учетные данные базы данных?

Я использую ibatis для подключения к базе данных в настольном приложении Java

Любая помощь будет оценена.

спасибо

Ответы [ 4 ]

1 голос
/ 26 декабря 2011

Хотите ли вы удалить искушение или сделать невозможным для пользователей поиск имени пользователя / пароля для ручного подключения к базе данных?

Если вы просто хотите удалить искушение, вы можете, конечно, зашифроватьфайл.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 на сервер приложений;т.е. превратите ваш толстый клиент в более тонкий один.Вы получаете разделение между приложением Windows и базой данных.Ваш сервер приложений будет выполнять все запросы к базе данных на основе команд, полученных приложением Windows.

В этом случае приложение Windows больше не будет запускать запросы самостоятельно, поэтому ему вообще не понадобятся учетные данные базы данных.;учетные данные базы данных будут храниться на сервере приложений.

0 голосов
/ 05 января 2012

Я также искал ту же проблему защиты файла Database.properties и нашел простой способ:
Если вы знаете, что пользователь вашего приложения будет подключен к Интернету, то без использования шифрования-дешифрования просто разместите файл свойств на любом бесплатном файловом хостинге, который может предоставить вам два основных свойства:

  1. , которая может предоставить вам прямую ссылку на файл.
  2. и предоставляет вам возможность редактировать один и тот же файл всякий раз, когда вы хотите его изменить.

Одним из решений, которое я использую, является Dropbox . Вы можете посмотреть руководство по использованию свойства его общей папки Здесь ... Надеюсь, что это решит вашу проблему так же, как и мою :))

0 голосов
/ 15 декабря 2011

Что бы вы ни делали, имейте в виду, что для шифрования пароля вам нужен ключ, и вам придется где-то хранить этот ключ. Это относится к любому решению, которое вы выбираете для шифрования, и также применимо к серверу приложений.

Это означает, что безопасность ключа должна рассматриваться как-то, например, безопасность может быть настроена на уровне учетной записи UNIX или что-то в этом роде.

Вот хороший пример кода, который шифрует данные и генерирует ключ:

http://exampledepot.com/egs/javax.crypto/DesString.html

А вот как сохранить ключ загрузки из файла:

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

0 голосов
/ 15 декабря 2011

Используете ли вы IBatis в веб-приложении?Если это так, вы должны настроить детали доступа к базе данных в веб-контейнере, а не в приложении.Тогда ваше приложение получит доступ к базе данных через контейнер (Tomcat, GlassFish, Websphere и т. Д.) И не будет беспокоиться о безопасности.

В основном вы хотите настроить JNDI DataSource - что-то, что существует в структуре контейнера ине ваше приложение.Я бы не хотел, чтобы детали доступа к базе данных были в файле свойств, если бы я мог помочь.

...