23
зареєстровані користувачі. Самий простій спосіб - зберігати в програмі результат
обчислення криптографічної хеш функції від кожного коду. При цьому легко
перевірити правильність ключа, обчисливши його хеш, однак, маючи значення хеш
функції, обчислити ключ практично неможливо. Якщо частину реєстраційного коду
зробити статичною (однаковою для всіх кодів), то її можна використовувати як ключ
для шифрування програми. Але при такому підході заблокований код легко може
бути використаний для розшифрування,
якщо його хеш додати у таблицю, що
зберігається всередині програми, або взагалі відключити перевірку правильності
хеша. Тому правильніше для кожної нової публічної версії продукту випадковим
чином генерувати ключ шифрування програми, при цьому кожен запис таблиці
повинен одержуватись шляхом зашифрування ключа програми на ключі,
отриманому з реєстраційного коду. І, зрозуміло, кожен запис повинен містити деяку
контрольну інформацію, що дозволяє оцінити правильність розшифрування.
У кожного з описаних методів перевірки правильності кодів є свої переваги і
недоліки.
Так "чорний ящик" порівняно простий в реалізації і дозволяє використовувати
короткі коди, прив'язані до імені користувача. Але майже завжди при використанні
цього підходу можливе створення генератора ключів.
Методи, що базуються на стійкій криптографії, досить складні для самостійної
реалізації і дуже часто вимагають довгого кодового рядка. Крім того, багато
алгоритмів на сьогодні запатентовані.
Табличні методи дають можливість повністю блокувати зламані реєстраційні
коди, однак не дозволяють прив'язувати код до імені користувача. Крім того, якщо
число користувачів дуже велике, таблиці можуть займати великий об'єм.
4.3. Апаратні ключі
Одним із сучасних методів захисту ПЗ є
використання апаратних ключів, які
поставляються разом з ліцензійним ПЗ і виконуються функцію його захисту від
несанкціонованого використання. Апаратні ключі виконуються у більшості випадків
у вигляді флеш пристрою та підключаються до одного з портів ПК. При запуску ПЗ
із методом захисту на основі апаратних ключів відбувається звернення ПЗ до порту з
ключем та виконується ряд запитів до ключа, який функціонує на базі певного
алгоритму. Сьогодні відомо багато алгоритмів на основі яких працюють апаратні
ключі.
Наведемо найбільш розповсюдженні алгоритми захисту з використанням
апаратних ключів:
Ключі з пам'яттю – один з найпростіших типів ключів. Ключі з пам'яттю
мають певне число комірок пам’яті, з яких дозволено зчитування. У деякі з
цих комірок також може проводитися запис. Зазвичай в комірках пам’яті
недоступних для запису, зберігається унікальний ідентифікатор ключа.
Ключі з пам'яттю не здатні протистояти емуляції. Достатньо один раз
прочитати всю пам'ять і зберегти її в емуляторі. Після цього правильно
емулювати відповіді на всі запити до ключа не складе великих труднощів.
24
Таким чином, апаратні ключі з пам'яттю в заданих умовах не здатні дати
ніяких переваг в порівнянні з чисто програмними системами.
Ключі з невідомим алгоритмом. Багато сучасних апаратних ключів містять
секретну
функцію перетворення даних, на якій і ґрунтується секретність
ключа. Іноді програмістові надається можливість вибрати константи,
перетворення, що є параметрами, але сам алгоритм залишається невідомим.
Перевірка наявності ключа повинна виконуватися таким самим чином. При
розробці захисту програміст робить декілька запитів до алгоритму і
запам'ятовує отримані відповіді. Ці відповіді в якійсь формі кодуються в
програмі. Під час виконання програма повторює ті ж запити і порівнює
отримані відповіді із збереженими значеннями. Якщо виявляється
неспівпадання,
значить, програма отримує відповідь не від оригінального
ключа. Ця схема має один істотний недолік. Оскільки захищена програма
має кінцевий розмір, тому і кількість правильних відповідей, які вона може
зберігати є обмеженою. А це означає, що
існує можливість побудови
табличного емулятора, який знатиме правильні відповіді на всі запити,
результат яких може перевірити програма.
Ключі з таймером. Деякі виробники апаратних ключів пропонують моделі,
що мають вбудований таймер. Але для того, щоб таймер міг працювати в
той час, коли ключ не підключений до комп'ютера, необхідне вбудоване
джерело живлення. Середній час роботи батареї, що живить таймер, складає
4 роки, і після її розрядки ключ перестане правильно функціонувати.
Можливо, саме із-за порівняно короткого часу життя ключі з таймером
застосовуються досить рідко. Прикладом таких ключів є ключі HASP Time,
що надають можливість дізнаватися поточний час, встановлений на
вбудованому в ключ годиннику. І
захищена програма може
використовувати ключ для того, щоб відстежити закінчення тестового
періоду. Але очевидно, що емулятор дозволяє повертати будь-які покази
таймера, тобто апаратна частина ніяк не підвищує стійкість захисту.
Ключі з відомим алгоритмом. У деяких ключах програмістові, що
реалізовує захист, надається можливість вибрати з безлічі можливих
перетворень даних, що реалізовуються ключем, одне конкретне
перетворення. При цьому програміст знає всі деталі вибраного
перетворення і може повторити зворотне перетворення в чисто програмній
системі.
Наприклад, апаратний ключ реалізує симетричний алгоритм
шифрування, а програміст має можливість вибирати використовуваний
ключ шифрування. Зрозуміло, ні в кого не повинно бути можливості
прочитати значення ключа-шифрування з апаратного ключа. У такій схемі
програма може передавати дані на вхід апаратного ключа і отримувати у
відповідь результат шифрування на вибраному ключі. Але тут виникає
дилема. Якщо в програмі відсутній ключ шифрування, то повернені дані
можна перевіряти тільки табличним способом, а значить, в обмеженому
об'ємі. Фактично маємо апаратний ключ з невідомим програмі алгоритмом.
Якщо ж ключ шифрування відомий програмі, то можна перевірити
правильність обробки будь-якого об'єму даних, але при цьому існує
25
можливість витягання ключа шифрування і побудови емулятора. А якщо
така можливість існує, супротивник обов'язково спробує нею скористатися.
Ключі з програмованим алгоритмом. Дуже цікавим рішенням з погляду
стійкості захисту є апаратні ключі, в яких може бути реалізований
довільний алгоритм. Складність алгоритму обмежується тільки об'ємом
пам'яті і системою команд ключа. В цьому випадку
для захисту програми
важлива частина обчислень переноситься в ключ, і у супротивника не буде
можливості запротоколювати правильні відповіді на всі запити або
відновити алгоритм по функції перевірки. Адже перевірка, як така, може
взагалі не виконуватися — результати, повернені ключем, є проміжними
величинами в обчисленні якоїсь складної функції, а значення, що
подаються на вхід, залежать не від програми, а від оброблюваних даних.
Достарыңызбен бөлісу: