Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Comanche

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

14.01.2009, 17:23. Показов 1325. Ответов 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, заголовок процедуры
обработки которого выглядит следующим образом:
Code
1
2
Private Sub TDBGrid1_FormatText(ByVal ColIndex As Integer, Value As Variant, _
                                Bookmark As Variant)
Достаточно поставить в код этой процедуры ЕДИНСТВЕННУЮ строчку:
Code
1
2
    Value = Decode(Value)
    ' здесь Decode() - имя моей функции, выполняющей расшифровку строки
и грид будет отображать расшифрованные данные!
Я много чего пробовал, и могу сказать, что с точки зрения быстродействия и
минимальности кодирования это самый оптимальный вариант. Конечно, он подходит только
тем, кто пользуется в работе компонентой TDBGrid (даже необязательно и TData - вместо
TData мне неоднократно советовали пользоваться ADODB, оно быстрее).

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

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

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

Пользуйтесь наздоровье!
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.01.2009, 17:23
Ответы с готовыми решениями:

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

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

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

3
IgorB
14.01.2009, 17:37
A ne sozdayet li eto trudnosti pri izmenenii zapisey?
Ved' nujno budet posle decode-- snova zashifrovyvat' recordy.
Comanche
14.01.2009, 18:33
Трудностей никаких.
При добавлении новой записи в базу добавляешь в код вызов функции
Encode(), противоположной по сути функции Decode(). Например, так:
Code
1
2
3
4
5
6
7
8
    a = InputBox('Введите Имя:', 'Добавление новой записи')
    b = InputBox('Введите Номер Телефона:', 'Добавление новой записи')
    With TData1.Recordset
        .AddNew
        !Name = Encode(a)
        !Phone = Encode(b)
        .Update
    End With
И всех делов. При изменении существующей записи это выглядит так:
Code
1
2
3
4
5
6
7
    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
Ещё раз хочу подчеркнуть, что при использовании события FormatText
дешифровка происходит только для отображаемой в гриде величины!
Значение, хранимое в базе, не затрагивается никак! Поэтому ничего
страшного, если базу сопрут, сломают пароль и откроют для просмотра
в Аксессе: там будет полная ахинея, расшифровать которую тем труднее,
чем совершеннее была ваша начинка для функции Encode(), т.е. чем
круче был ваш алгоритм шифрования.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2009, 18:38
Помогаю со студенческими работами здесь

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

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

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

Как и где взять программу для защиты двд видеодиска от копирования. Хоть какой нибудь способ?
Собираюсь продавать диски. Мой собственный продукт.

Есть ли способ безопасно сохранить пароль в программе? То есть вшить в прогу пароль от локальной базы данных например.
Замутил класс, буду наполнять его полезными методами. Возможно создам ещё один другой класс, не расширение. public static class...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru