Відомо, що на сьогоднішній день не існує способу захистити значення, збережені в таблицях БД Access від прямого доступу. Або захист видаляється за допомогою програм типу dbRecowery, або вона накладає серйозні обмеження на продуктивність додатків працюють з БД і все одно зламуються, але з великими затратами.
Ось гідності пропонованого способу:
- захист встановлюється і знімається натисненням однієї кнопки
- додавання захисту в код - додавання одного рядка при підключенні БД і змінити рядок з паролем в коді. (більше ні чого міняти не треба)
- її не можна зняти програмами типу dbRecowery
- її використання майже не позначається на продуктивності
- можна використовувати ADO або DAO
- захищає код можна інтегрувати в VB проект (2 класу і 2 модуля)
- не треба платити за програми та електронні ключі
Ось його недоліки:
- реалізовано у вигляді Active-X dll на Visual Basic 6 (не вдалося зробити на VBA)
- працює тільки на читання даних (запис не реалізована)
- працює під WinXP; має працювати під 2k; під 98 - не працює (треба доробляти)
Про тестовому проекті
- data.mdb - захищена БД з двома таблицями і одним запитом
- user.mdb - БД з формою 'main' в яку виводяться дані з data.mdb за допомогою Protect.dll
- Protect.dll - шукає data.mdb в тій же директорії, де і сама і повертає ADODB.Recordset для реєстрації необхідно виконати в командному рядку 'regsvr32.exe [Ваш шлях до] \ Protect.dll'
Опис способу захисту
Даний спосіб заснований на використанні прозорого шифрування. При такому підході працює з даними програма не помічає, що дані зашифровані. Іншими словами, коли бібліотеки ADODB нашої програми звертаються до файлу БД - вони бачать самий звичайний файл. Але якщо з цими даними починає працювати чужа програма - вона бачить зашифровані дані. Подібний підхід використовується в HASP Envelope. Але з його допомогою шифрується весь файл, що сильно знижує продуктивність. Тим часом, досить зашифрувати тільки заголовок БД щоб отримати прийнятний рівень захисту.
Для роботи з БД Access в даний час використовується ADODB. Спочатку створюється підключення до файлу БД (ADODB.Connection). Коли задані всі параметри підключення - викликається метод Open, який відкриває БД. При цьому, відбувається читання перших H10000 байт файлу БД. Тут і спрацьовує захист. ми ці H10000 байт попередньо зашіфруем. Програма перехоплює виклик API функції ReadFile, сама зчитує заголовок БД, і повертає дешифровані дані.
Щоб перехопити виклик API функції ReadFile необхідно зробити наступне:
Заміщає функція має той же набір аргументів, що і оригінальна ReadFile. Таким чином, отримавши управління в свої руки, ми знаємо - звідки і скільки треба вважати і куди результат помістити. При виклику замещающеё функції відбувається наступне: