зашифровать файл свойств для Ibatis

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

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

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

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

Благодарность


person Joe123    schedule 15.12.2011    source источник


Ответы (4)


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

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

person Bogdan    schedule 26.12.2011

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

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

person Ewald    schedule 15.12.2011
comment
Здравствуйте, Эвальд, спасибо за ваш ответ, но я использую ibatis с настольным приложением Java, а не с веб-приложением. Как вы сказали, если у меня есть контейнер, такой как tomcat, он будет включен в него. Но в моем случае у меня нет. Любая идея, как это сделать в настольном приложении Java? - person Joe123; 15.12.2011
comment
Привет, единственный другой вариант - использовать некоторую схему шифрования в вашем приложении для шифрования и расшифровки текстового файла. Это одурачит случайного хакера, но не решительного. Я использовал зашифрованные ZIP-файлы именно для этой цели в прошлом, не идеальное решение, но оно работало в контексте и было достаточно безопасным для данного сценария. - person Ewald; 29.12.2011

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

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

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

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

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

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

person Stas    schedule 15.12.2011
comment
У меня есть настольное приложение Java, которое я использую ibatis для подключения к базе данных. В файле свойств я устанавливаю имя пользователя и пароль базы данных. Но в этом решении любой может открыть файл jar приложения и открыть файл свойств, а затем узнать имя пользователя и пароль. Проблема в том, что когда я впервые запускаю свое приложение, мне нужно иметь имя пользователя и пароль для подключения к базе данных... - person Joe123; 15.12.2011
comment
Спрашивать у пользователя имя пользователя и пароль? Или я не мог понять дело ясно... - person Stas; 16.12.2011
comment
Пользователь, который использует это приложение, ничего не знает о базе данных... и он не знает имя пользователя и пароль базы данных. Я просто хочу защитить свое приложение, поэтому, если он или кто-то другой откроет файл jar или извлечет его, он не должен знать имя пользователя/пароль, потому что он может изменить вручную в базе данных - person Joe123; 16.12.2011

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

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

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

person Asif    schedule 05.01.2012
comment
link, который вы будете использовать для извлечения свойств из файла .properties, будет находиться только в скомпилированном файле class, который нелегко взломать. - person Asif; 05.01.2012
comment
.properties file will be just in your compiled class,, which is not readily breachable... Банку можно разархивировать, класс можно декомпилировать, извлечь ссылку и получить файл свойств. Есть только один способ сделать это безопасным — отодвинуть iBatis от клиента. - person JohnDoDo; 05.01.2012