Способи збереження і завантаження параметрів програмного забезпечення. Їх переваги і недоліки. Впровадження засобів захисту.
У цій статті мова піде про способи збереження і завантаження параметрів програмного забезпечення. Зі свого особистого досвіду я можу твердо сказати, що це не так просто, як здається багатьом. Як Ви вже встигли помітити, великі програмні продукти використовують для зберігання своїх параметрів виключно системний реєстр. Навпаки, розробники програмного забезпечення, які відносять його до Freeware, вважають за краще конфігураційні файли з розширенням "INI" (далі "ini-файли"). Чому ж справа йде саме так? Ми розглянемо два цих способу більш детально, а так же поговоримо про впровадження певних засобів захисту ini-файлів.
Системний реєстр - один з найнадійніших, але аж ніяк не найбезпечніший способів зберігання параметрів. Дані в ньому розташовуються у вигляді ієрархічної структури, що полегшує пошук потрібного розділу, але тим самим збільшує ризик видалення даних. Загрозою втрати даних, що знаходяться в реєстрі, крім необережних дій самих користувачів, можуть бути збої в операційній системі Microsoft Windows. Але це вже інша історія.
Для роботи з системним реєстром в Borland Delphi передбачений модуль Registry, який містить клас TRegistry.
Розглянемо принципи збереження і завантаження даних, використовуючи системний реєстр, на невеликому прикладі, який буде містити дві процедури GetCaption і SaveCaption.
Варто сказати ще про двох процедурах модуля Registry: GetKeyNames і GetValueNames. Вони дозволяють сканувати реєстр, як звичайні каталоги. При відкритті ключа ви вказуєте початковий шлях пошуку, а далі процедура GetKeyNames створює список типу TStrings і записує в нього імена всіх знайдених ключів, а процедура GetValueNames становить список з імен параметрів, що знаходяться в заданому ключі.
До появи 32-х розрядних операційних систем, для зберігання параметрів програми використовували виключно конфігураційні файли з розширенням "INI" (далі ini-файли). Але незабаром, ini-файли були забуті, і на зміну їм прийшов системний реєстр. Але до сих пір зустрічаються програми, які активно використовують такий спосіб зберігання параметрів. У чому ж його переваги? Перш за все в стабільності. На відміну від системного реєстру, при збоях в операційній системі з ini-файлом нічого не трапляється, якщо тільки він не знаходиться в системному каталозі. Варто пам'ятати, що ini-файл повинен знаходитися в одному каталозі з програмою. Крім стабільності, важливою перевагою ini-файлів є мобільність програмного коду, в чому ви можете переконатися, подивившись приклад, наведений нижче. Що ж стосується недоліків, то це простота видалення. Ini-файл - це звичайний файл, який можна випадково видалити.
Для роботи з ini-файлами в Borland Delphi передбачений модуль IniFiles.
Принципи роботи Ini-файлів і системного реєстру схожі між собою. Змінимо попередню програму, яка зберігала і змінювала заголовок форми, використовуючи системний реєстр.
Як бачите, в порівнянні з попередньою програмою, спостерігається зменшення програмного коду. Та й помилок при роботі з ini-файлами виникає так само набагато менше, ніж з системним реєстром.
А тепер, поговоримо про засоби захисту. Операційна система надає можливість закриття доступу до певних файлів. Але, на жаль, закриття доступу триває тільки під час роботи програми. Після того, як програма буде закрита, доступ буде повністю відкритий. Наприклад, можна обмежити доступ до ini-файлу. Для реалізації даної можливості, серед безлічі функцій WinAPI існує функція OpenFile. Давайте спробуємо написати програму, яка закривала б доступ до ini-файлу.
(Рис. 1) Обмеження доступу до файлу Test.ini
Уважний читач може заперечити, що ніякого сенсу в цьому захисті немає. Адже після завершення роботи програми, користувач може легко змінити вміст файлу. І він буде абсолютно правий. Тому, необхідно додати ще одну функцію безпеки - кодування тексту.
При завершенні роботи програми, захист автоматично знімається, і далі йде шифровка тексту. При наступних запусках програми, файл розшифровується, і вже на розшифрований файл ставиться захист, що тим самим повністю перекриває доступ до нього.
Слід досить серйозно ставитися до стандартів шифрування. Найпростіші способи найчастіше відомі багатьом. Будь-яка людина, використовуючи схожий алгоритм шифрування, може без праці розшифрувати зашифрований раніше файл.
Я написав дві найпростіші процедури кодування та декодування тексту. На їхньому прикладі ми і розглянемо роботу нашої програми.
(Рис. 2) Файл "Test.ini" в зашифрованому вигляді
Це один з найефективніших способів захисту. Як бачите, за своїми якостями ini-файли є більш надійним способом зберігання даних, ніж системний реєстр. До файлів, що входять в нього, неможливо заблокувати доступ. Написані мною процедури шифрування можна використовувати і при роботі з системним реєстром, але в будь-який момент користувач може з легкістю змінити навіть зашифровані дані, що може привести до сумних наслідків.
Слід сказати пару слів про самих алгоритмах кодування та декодування тексту. Як ознаки того, що файл вже був закодований, використовується звичайна текстова рядок "Crypted", якій відповідає константа csCryptHeader. Вона слід спочатку кожною зашифрованою рядки. Перед шифруванням, визначається довжина рядка csCryptHeader, після чого збільшується довжина майбутньої рядки, яка дорівнює довжині шіфруемий рядки і довжині рядка csCryptHeader. Далі, простим перебором, відбувається заміна кожного символу шіфруемий рядки. Це здійснюється за допомогою функції Chr, яка по згенеровані програмою числу повертає відповідний символ. При заміні символів, слід враховувати певні параметри, які визначає логічна операція. У нашому прикладі, в залежності від того, чи ділиться порядковий номер рядка на два без залишку, використовуються різні параметри, що ускладнює подальшу дешифрування тексту.
При дешифрування тексту визначається його реальна довжина, що досягається вирахуванням з довжини дешіфруемой рядки довжини рядка csCryptHeader. Для того, що б визначити, пошкоджений файл чи ні, програма шукає в закодованої рядку заголовок, в нашому прикладі це "Crypted", і якщо він відсутній, то дешифрування припиняється і виникає помилка. Якщо ж все в порядку, далі йде розшифровка тексту, алгоритм якої повністю протилежний алгоритму шифрування.
Отже, всі способи, освітлені в статті, були детально розібрані і обумовлені. Тепер вибір за вами. Спробуйте описані в цій статті способи на своїй практиці. Імпровізуйте, намагаючись створити щось досконале, і рішення у виборі між системним реєстром і ini-файлами прийде до вас.