шифровайте файл със свойства за 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 файла или го извлече, той не трябва да знае потребителското име/паролата cz, той може да промени ръчно в базата данни - 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