Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Microsoft Access - программирование и готовые решения


Выпуск 75. Материалы для начинающих (22 урок)

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         30.03.2007
Автор:     Дмитрий Сонных (aka Joss)
Сайт:        http://www.accessoft.ru под редакцией с http://www.leadersoft.ru/
Новые материалы: защита данных в Access
На сайте AccesSoft публикуются статьи, посвященые вопросам, связанным с разработкой и продвижением приложений Access. Вы так же можете ознакомиться с готовыми программами, получить исходный код, купить программу, связаться с автором для решения вопроса о доработке программы под Ваши требования.



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

Защита данных в файлах MDB СУРДБ Access. Часть 5.

Шифрование/Дешифрование базы средствами Access.

    Вот что я нашел про кодирование/раскодирование баз данных Access в книге «Access 2002. Разработка корпоративных приложений.» П.Литвина, К.Гетца и М.Гунделоя.

    «Как бы хорошо не была защищена база данных Jet, любой мало-мальски сообразительный хакер может при помощи низкоуровневого дискового редактора и получить доступ к её содержимому. Поэтому серьезная защита баз данных предполагает ещё и их шифрование. Конечно, взлом баз данных – дело не самое обыденное, но искатель приключений всегда может найтись. Само по себе шифрование базы данных ещё не гарантирует её надежной защиты, но всё же препятствует её просмотру средствами, внешними по отношению к Access и Jet.

    Зашифровать и дешифровать базу данных могут только её владелец и члены группы Admins. Для шифрования Jet использует алгоритм RSA (назван по первым буквам фамилий его изобретателей: Rivest, Shamir, Adelman) с ключом на основе идентификатора рабочей группы. Для шифрования и дешифрования предназначена команда Access Tools > Security .> Encrypt / Decrypt Database.

    У шифрования базы данных имеется два негативных побочных эффекта. Во-первых, снижается её быстродействие – по оценкам Microsoft, процентов на 10-15. Во-вторых, зашифрованную базу данных нельзя сжимать такими программами, как PKZip, LHA, Stacker и DriveSpace. Точнее, сжимать можно, только в этом нет смысла – её размер уменьшится незначительно».

    Вот, что удалось ещё нарыть на сайте Microsoft:

    Шифрование базы данных — это простейший способ защиты. При шифровании базы данных ее файл сжимается и становится недоступным для чтения с помощью служебных программ или текстовых редакторов.

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

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

    Немного потыкал клавиши. В шифрованную базу можно добавлять записи, а имеющиеся - изменять. Шифрованную базу можно сжимать. Таблицы из шифрованной базы можно подлинковывать.

    Пароль на базу не шифруется. Тело базы шифруется начиная с адреса 1000h. При просмотре тела базы разными вьюерами там действительно ерунда. Программы типа AccessFix не могут ничего из базы выдрать. (по крайней мере версии 3.70). Они там просто ничего не находят. Объекты из шифрованной базы можно импортировать в другую базу и они уже будут не шифрованные.

    Вывод, шифровать стоит базу, уже защищенную стандартными средствами при помощи MDW.

    На что не смог найти ответа:

  1. можно ли к шифрованной базе подключиться из других клиентов - VB, Delphi, VC... (скорее всего можно)?
  2. в случае краха, какова вероятность восстановления шифрованной БД?

Об алгоритме шифрования RSA можно прочитать вот здесь http://ru.wikipedia.org/wiki/RSA
А об его стойкости - http://www.bugtraq.ru/library/crypto/rsa.html


Комментарий к выпуску (№71)

    Во-первых, нельзя ни в коем случае рекомендовать начинающим разработчикам писать свои алгоритмы шифрования. Они начинают придумывать что-то типа "заXORим все байты с байтом 55" или "добавим к каждому байту случайное число". Раскалывание таких "шифров" давали моему сыну в качестве домашней работы на первом семестре обучения курсу защиты данных. А ничего более умного начинающий программист всё равно не изобретёт :((

    Во-вторых, ваша рекомендация насчёт шифрования или сжатия текстовых полей будет приводить к неожиданным ошибкам, когда в текстовое поле будут записываться символы hex(0). Программа может работать месяцами на разных данных, а потом найдётся такой текст, который вызовет ошибку. Простейший пример:

Dim s As String
s = "abcdefgh"
Mid(s, 5, 1) = Chr(1)
DoCmd.RunSQL "insert into T_non_char_data(sNonChar) values ('" & s & "')"

работает отлично, а вот

Dim s As String
s = "abcdefgh"
Mid(s, 5, 1) = Chr(0)
DoCmd.RunSQL "insert into T_non_char_data(sNonChar) values ('" & s & "')" даёт дуба...

Лично вы на эти грабли не наступите, конечно, но те, которые вас читают, сделают это наверняка.

Павел Воронков http://sq.narod.ru


    Да здесь действительно могут возникнуть проблемы. Но если Вы  будете вставлять данные не через “INSERT INTO …” , а через рекордсет и присвоение, то таких проблем не возникнет. Т.е. Вот такая запись вполне работоспособна.

rs.Open strsql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rs.AddNew "nameorg", Chr(0) + Chr(0)

    Кроме того, дело в том, что я шифрованные данные помещаю не в поле типа String а поле OLE. При этом убираются все ограничения на использование знаков в данных. Можно составить алгоритм шифрования, который использует только символьную часть кодовой таблицы, и кроме сдвига учитывать ещё и положение букв в строке.

Дмитрий Сонных (aka Joss)


В избранное