Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Comanche
#1

Красивый способ защиты базы данных Аксесса! - VB

14.01.2009, 17:23. Просмотров 798. Ответов 3
Метки нет (Все метки)

Как защитить MDB-базу Аксесса - тема старая и избитая. Все уже давно сошлись на том
мнении, что самое глупое решение - это установка пароля. Ломается в две секунды.

Когда я написал простенькую СУБД на VB 6.0 для своей конторы, то, разумеется, очень
скоро столкнулся с просьбой сделать защиту. Довольно долго изучал ресурсы Сети на эту
тему, всякие конфы и форумы, и так ничего путного и не нашёл. Единственное, к чему
склоняется большинство разработчиков, - это хранить данные в базе в зашифрованном
виде. Если использовать хороший алгоритм шифрования, то этот вариант будет всё же
понадёжнее штатного пароля. Хотя кому надо - всё равно вскроет: есть такая наука -
'Криптография'. И на каждый 'хороший' алгоритм шифрования обязательно найдётся
такой же 'хороший' криптограф ...

В моём проекте от Аксесса был только формат базы. Весь интерфейс был реализован на
VB, с использованием контролов True DataControl 6.0 и True DBGrid Pro 7.0 от компании
ComponentOne. В общем случае, TData был завязан на некоторую таблицу базы, а TDBGrid -
на TData. Поэтому, если хранить всё в базе в зашифрованном виде, то сталкиваешься с
проблемой: как 'вклиниться' в эту цепочку 'MDB >>> TData >>> TDBGrid', чтобы ловко
дешифровать данные ПЕРЕД ИХ ОТОБРАЖЕНИЕМ в гриде TDBGrid.

Неожиданно меня выручило одно из событий, генерируемых контролом TDBGrid. Это событие
'FormatText'. Если у какой-либо колонки грида свойство NumberFormat установить (из
кода или в design mode - неважно) в 'FormatText Event', то перед отображением любой
ячейки из такой колонки будет генерироваться событие FormatText, заголовок процедуры
обработки которого выглядит следующим образом:
Код
Private Sub TDBGrid1_FormatText(ByVal ColIndex As Integer, Value As Variant, _
                                Bookmark As Variant)
Достаточно поставить в код этой процедуры ЕДИНСТВЕННУЮ строчку:
Код
    Value = Decode(Value)
    ' здесь Decode() - имя моей функции, выполняющей расшифровку строки
и грид будет отображать расшифрованные данные!
Я много чего пробовал, и могу сказать, что с точки зрения быстродействия и
минимальности кодирования это самый оптимальный вариант. Конечно, он подходит только
тем, кто пользуется в работе компонентой TDBGrid (даже необязательно и TData - вместо
TData мне неоднократно советовали пользоваться ADODB, оно быстрее).

=====================================================================================
Перед тем, как найти этот вариант, я также пробовал использовать для тех же целей
событие FetchCellStyle, внутри которого писал что-то вроде следующего:
Код
    TDBGrid1.Columns(Col).Text = Decode(TDBGrid1.Columns(Col).Text)
но - увы! - это приводит к изменению самОй базы, т.е. свойство Text (как и Value,
впрочем) работает не с отображаемым текстом, а именно с 'underlying data', с базой.
И всякие TDBGrid1.AllowUpdate = False на этот не влияют никак. В итоге, приведённая
выше строчка 'портит' базу, что недопустимо.

Также я пробовал использовать вычисляемые поля, заводимые на страничке 'Fields'
контрола TData наряду с полями самОй базы. Но набор функций, которыми можно пользо-
ваться при составлении выражения для вычисляемого поля, слишком убог: самое крутое,
что там есть, - это StrReverse(), делающая строке 'переворот задом наперёд'.

Ну и пробовал, конечно, делать дешифровку прямо в коде, используя 'клонирование'
рекордсетов и т.п., но по элегантности и скорости это в подмётки не годится описанно-
му выше методу.

Пользуйтесь наздоровье!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2009, 17:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Красивый способ защиты базы данных Аксесса! (VB):

Создать программное средство криптографической защиты данных
В среде программирования Visual Basic создайте программное средство...

Импорт данных из одной базы данных Access в другую
Здравствуйте уважаемые господа Программисты. Столкнулся с проблемой. ответ...

Добавление данных из ComboBox в таблицу базы данных
ну типа выбрал строку в комбобоксе, нажал добавить и эта строка добавляется в...

Как сделать так что бы прога на VB + Access работала без установленного на компе бейсика и аксесса?
Интересный вопрос: Как сделать так что бы прога на VB + Access работала без ...

Способ хранения картинок в файле базы данных
До этого времени в БД хранился путь к картинке названия поста, но возникла...

Каков командный способ создания базы данных?
Т.е. при помощи каких SQL - команд это делается и пример , если можно. Спасибо.

3
IgorB
14.01.2009, 17:37 #2
A ne sozdayet li eto trudnosti pri izmenenii zapisey?
Ved' nujno budet posle decode-- snova zashifrovyvat' recordy.
Comanche
14.01.2009, 18:33 #3
Трудностей никаких.
При добавлении новой записи в базу добавляешь в код вызов функции
Encode(), противоположной по сути функции Decode(). Например, так:
Код
    a = InputBox('Введите Имя:', 'Добавление новой записи')
    b = InputBox('Введите Номер Телефона:', 'Добавление новой записи')
    With TData1.Recordset
        .AddNew
        !Name = Encode(a)
        !Phone = Encode(b)
        .Update
    End With
И всех делов. При изменении существующей записи это выглядит так:
Код
    With TData1.Recordset
        a = InputBox('Введите Имя:', 'Редактирование записи', Decode(!Name))
        b = InputBox('Введите Номер Телефона:', 'Редактирование записи', Decode(!Phone))
        !Name = Encode(a)
        !Phone = Encode(b)
        .Update
    End With
т.е. в последнем варианте в InputBox-е в качестве default-значения
высвечивается текущее значение изменяемой записи.

PS: InputBox взята для простоты. Ясно, что ей никто пользоваться не будет.
Comanche
14.01.2009, 18:38 #4
Ещё раз хочу подчеркнуть, что при использовании события FormatText
дешифровка происходит только для отображаемой в гриде величины!
Значение, хранимое в базе, не затрагивается никак! Поэтому ничего
страшного, если базу сопрут, сломают пароль и откроют для просмотра
в Аксессе: там будет полная ахинея, расшифровать которую тем труднее,
чем совершеннее была ваша начинка для функции Encode(), т.е. чем
круче был ваш алгоритм шифрования.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2009, 18:38
Привет! Вот еще темы с решениями:

Есть ли способ связать Grid базы данных с TreeView?
subj.

Способ защиты документа от сохранения
Здравствуйте, меня интересует вопрос: можно ли защитить документ от сохранения,...

Способ защиты лицензии программы
Доброго времени суток. Стоит следующая задача: Есть программный продукт...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru