Под "защитой БД" здесь понимается способ предотвратить несанкционированный доступ к информации, хранимой в таблицах. Защита исходного кода форм и модулей не рассматривается.
Актуальность данной темы чрезвычайно высока. Об этом можно судить по первому месту в рейтинге (18 тысяч обращений) статьи "Защита баз mdb" которую написал Юрий Шерман. Мне встретилась даже книга в 500 страниц полностью посвящённая защите Access: Garry Robinson "Real World Microsoft Access Database Protection and Security.
Стандартные способы защиты
Данный способ защиты позволяет установить пароль на открытие БД, для всех пользователей. Для его создания необходимо открыть файл БД в "монопольном" режиме и выбрать пункт меню Сервис / Защита / Задать пароль базы данных. Для работы с такой базой данных в MS Access потребуется вводить пароль. Вот пример работы с файлом БД, используя DAO или ADO.
Это самый не надёжный способ защиты баз данных. Существует достаточное количество бесплатных и платных утилит, отображающих пароль. В том числе доступны исходники кода на VB позволяющие прочитать такой пароль. В прочем не всё так плохо. Однажды мне встретилось оригинальная модификация этого способа защиты, о котором речь пойдёт ниже.
Данный способ позволяет ввести дополнительный уровень ограничений, связанных с работой БД Access. Основан на создании файла рабочих групп, в котором определяются имена пользователей, их пароли и права на работу с различными объектами БД.
Последовательность действий для создания защищённого файла:
Вот пример открытия БД защищённой на уровне пользователей с помощью DAO или ADO
Снятие такой защиты.
Создать новую БД. В ярлыке прописать путь к этой БД, MDW файл защищённой БД имя и пароль владельца. Открыть с помощью этого ярлыка новую БД. Импортировать в неё таблицы из защищённой, после чего сменить для всех объектов БД владельца на Admin. Для того, чтобы узнать имя и пароль владельца БД можно воспользоваться специализированными программами, описанными в обзоре Пароли Access. При отсутствии файла рабочих групп его можно восстановить. Для этого потребуется узнать имена и идентификаторы владельцев объектов БД. Эта информация содержится в файле базы данных и может быть извлечена с помощью таких программ как AOPR. Используя эти данные создаётся новый файл. (последовательность описана выше)
Совсем не обязательно использовать программы, позволяющие определить пароль БД или пользователя. Часто программисты совсем не заботятся о сокрытии пароля в тексте программы. Запустив программу, работающую с защищённой БД необходимо открыть в шестнадцатеричном редакторе WinHex виртуальную память этого приложения. Проведя поиск Unicode строк 'User ID='; 'Password='; 'Database Password=' или 'pwd=' можно найти имя пользователя, его пароль и пароль базы данных.
Можно вовсе проигнорировать наличие защиты. Для этого надо воспользоваться AccessRecovery, которая создаёт новый файл без защиты и переносит в него таблицы, запросы, формы, макросы, отчеты и код модулей.
Нестандартные способы защиты
Достаточно простой способ ввести в заблуждение - изменение расширения файла БД. Увидев незнакомое расширение, не каждый попытается выяснить природу этого файла. Кроме этого появляется возможность связать это расширение с вашей программой, так чтобы при клике по файлу запускалось ваше приложение, а не Access. Желательно открывать такой файл с монопольным доступом, так как в этом случае не будет создаваться ldb файл.
В первую очередь этот способ нацелен на противодействие определению паролей с помощью специальных программ. Одна база с такой защитой хорошо попортила мне нестроение. Теперь я попорчу настроение её авторам рассказав об этой защите. Способ основан на том, что пароль БД формата Access 2000 и 2002-2003 - текстовая строка в формате Unicode. При этом, нет ни каких ограничений на её содержимое. Стандартный способ установки и использования пароля БД подразумевает его ввод с клавиатуры в диалоговом окне. Если стока пароля содержит непечатные символы, то они не будут корректно отображены программой открывающей пароли БД. С другой стороны этот пароль нельзя ввести в диалоговом окне при открытии БД в MS Access.
Но и про Access 97 я не забыл. Дело в том, что в спецификации баз данных и в справке по DAO 3.60 указано, что максимальное число символов в пароле - 14. Но на самом деле их может быть 20. При этом и сам Access 97 не допускает ввода строк пароля более 14 символов. В спецификации Access 2003 также сказано про 14 символов, но программа допускает ввод всех 20. Также возможно использование непечатных символов, что приводит большинство программ взламывающих пароли в ступор.
Для установки такого пароля потребуется использовать программу, использующую метод CompactDatabase библиотек ADOX или DAO.
Взлом защиты.
- Во-первых, можно воспользоваться AccessRecovery.
- Во-вторых, можно попытаться определить пароль БД с помощью специальных программ. В обзоре Пароли Access приводится сводная таблица по их возможностям.
- В-третьих, можно узнать пароль, проанализировав код программы в отладчике. Каков бы ни был пароль, он всё равно передаётся как текстовая строка в методе открытия БД. При наличии определённого опыта - это не очень сложная задача. Когда мне впервые встретилась подобная защита - пароль удалось найти, используя отладчик OllyDbg, найдя место создания ADODB.Connection
- Узнать или изменить пароль БД можно, не прибегая к помощи специальных программ. В Access 97 пароль получается сложением по XOR пароля с 20 байтной последовательностью. Значения этих байт можно получить из любого не защищённого паролем mdb файла. Начиная с Access 2k, в связи с использованием Unicode, для хранения 20 символов пароля отведены 40 байт. При шифровании также используется сложение по XOR, но для получения последовательности байт соответствующей пустому паролю необходимо создать файл с датой исследуемой БД. Полученные байты можно вписать в исследуемый файл и обнулить пароль, либо сложить их с аналогичными байтами исследуемого файла и получить значение пароля.
В данной работе не рассматриваются возможные манипуляции с файлами рабочих групп. Наверняка существуют способы защитить хранимые в них пароли от слишком любопытных программ, но все это теряет смысл при использовании AccessRecovery, который защиту вообще не замечает.
Способ защиты основан на модификации первых байт файла. Таким образом, перед открытием БД в её файл записывается правильный заголовок, хранимый в программе, а после закрытия возвращается неправильный. При попытке открыть файл БД с помощью ms Access появляется сообщение об ошибке. Не плохо совместить этот способ с изменением расширения файла. Например, можно взять заголовок dbf файла и записать его в начало mdb файла. Далее меняем расширение файла на dbf и наслаждаемся результатом. БД теперь можно открыть в Excel, Access или другой программой, позволяющей читать dbf файлы. Вот пример такого преобразования:
Метод не достаточно эффективен, так как программу, работающую с БД, можно прервать искусственно и на диске останется не защищённая БД. Поэтому стоит его использовать только в сочетании с другими способами.
Этот способ - дальнейшее развитие идеи модификации заголовка файла с целью противодействия программам, читающим пароли. Метод основан на том, что для работы с БД Access 97 и 2k программы используют разные алгоритмы чтения пароля и при этом пытаются самостоятельно определить версию mdb файла.
Для определения версии можно использовать последовательность из 40 байт, начиная с 122 от начала файла. Если в БД Access 97 вписать эту последовательность от Access 2k, то получим интересный результат. Программа ms Access, ADO и DAO нормально работают с этим файлом, а большинство взламывающих пароли программ попадаются на эту уловку. Аналогичный результат может быть получен при пересадке байтовой последовательности из Access 97 в Access 2k
Это ещё одно подтверждение, того, что стандартные способы защиты, даже от сторонних производителей уязвимы. Речь идёт о ключах HASP. С помощью утилиты HASP Envelope можно зашифровать файл (в данном случае БД) и разрешить к нему доступ только из защищённого приложения. Используется механизм "прозрачного" шифрования. Со стартом операционной системы запускается некий процесс, который отслеживает все обращения к защищённому файлу БД. Если это обращение исходит от обычного приложения, например от ms Access - файл читается и выводится сообщение о "нераспознаваемом формате базы данных". Но если с файлом работает указанное при шифровании приложение, то данные передаются ему в дешифрованном виде. В результате, сама программа, не подозревает о наличии защиты. Да, сложность взлома такой базы возрастает в разы. Но при этом надо помнить, что с приложением должен поставляться электронный ключ, ценой N у.е. и что скорость доступа к данным падает в два - три раза.
Взлом защиты.
Было найдено два способа получить БД своё полное распоряжение.
Этот способ не плох. Во всяком случае появляется реальная надежда что то спасти. Однако есть ряд ограничений. Перед отображением данных их необходимо дешифровать. Нет возможности поиска по части строки в зашифрованном поле. Алгоритм шифрования и ключ содержатся в программе, а значит, есть потенциальная уязвимость. В данном случае надёжность зависит от устойчивости к взлому программы, работающей с БД. Можно сочетать приятное с полезным: не шифровать, а сжимать содержимое memo полей. Разбираться с алгоритмом сжатия в коде программы занятие скучное.
Перед тем как ставить вопрос о способе защиты БД стоит задуматься о её необходимости. Не стоит полагаться на стандартные методы, но это не повод для отказа от использования Access. Специалист взломает что угодно, но можно сделать, чтобы это было не так просто.
В следующей статье описано прозрачное шифрование баз данных Access, которое имеет ряд преимуществ над существующими методами.
Ссылки по теме