Организация защиты от копирования

Основная идея (известная довольно давно) заключается в использовании алгоритма с открытым ключом. Наиболее распространенный из них -- RSA. Имейте в виду, что RSA запатентован в США, и для коммерческих применений требуется лицензия (стоимость ее мне неизвестна). Срок действия патента истекает в октябре 2000 г. Если это вас беспокоит, можете использовать другие системы шифрования с открытым ключом, например ElGamal, она не запатентована.

Вкратце схему применения RSA можно описать так. Генерируется пара ключей, один их которых является секретным, а второй открытым. Любой человек может зашифровать текст открытым ключом и послать обладателю секретного ключа, который единственный сможет его прочесть. Кроме того, человек с секретным ключом может зашифровать им сообщение, и все остальные, имея открытый ключ, смогут его расшифровать. Смысл последнего действия состоит в том, что сгенерировать такое сообщение (которое расшифровывается открытым ключом) может только обладатель секретного ключа.

В применении к защите программ от копирования используется именно второй путь, т.е. открытый ключ хранится в программе, а лицензионная информация шифруется секретным ключом. Следовательно, все могут расшифровать, что конкретно содержится в лицензии, но сгенерировать новую может только обладатель секретного ключа. Это принципиальное свойство алгоритмов шифрования с открытым ключом.

В традиционных симметричных методах шифрования (DES, Blowfish и т.д.) один и тот же секретный ключ используется и для зашифровки, и для расшифровки данных. Этот метод бесполезен при реализации защит от копирования: ваша программа должна будет содержать секретный ключ для расшифровки лицензионной информации, а это даст возможность взломщику выудить этот ключ из программы, какими хитроумными способами вы бы ее не защитили. После этого генерация поддельных лицензионных кодов становится тривиальной.

Каждая лицензия содержит в себе следующую информацию.

  1. Версия структуры лицензионного файла. В будущем возможны расширения и дополнения, и этот номер поможет программе определить, поддерживается ли данный формат лицензии данной версией (случаи, когда старый рег. код подсовывается новой программе и наоборот весьма часты).
  2. Номер лицензии. Он может быть просто порядковым номером, т.е. сравнительно небольшим целым числом. Используется в статистических целях и для отключения действия украденных лицензий. Если вам не нравится, что кто-то поймет, сколько лицензий продано, вы можете сделать этот номер случайным (но уникальным!) целым числом.
  3. Тип лицензии. Он может означать, например, персональную лицензию, site license, professional version и т.д. -- чего ваша душа пожелает разграничить по стоимости лицензирования. Например, некоторые возможности вашей программы могут быть доступны лишь за дополнительную плату, и тип лицензии будет содержать информацию, следует ли включать эти возможности.
  4. Время начала лицензии. Это не всегда нужно, но может оказаться полезным в некоторых обстоятельствах, например, чтобы заставить пользователей перейти на новую версию вашей программы, или выдать поздравление по истечении года пользования, или еще зачем-нибудь. Конечно, это поле (и следующее) вовсе не являются обязательными.
  5. Время окончания лицензии.
  6. Имя покупателя. Используется для идентификации покупателя в программе. Кроме того, является ограничивающим фактором при незаконной передаче лицензии.
  7. Другая информация. Это может быть, например, список IP адресов или доменов, на компьютерах с которыми программе разрешено работать (может быть полезно при выдаче site license).

Заметим, что файл с персональной лицензией, не привязанной каким-либо образом к покупателю, все равно могут украсть. К сожалению, это свойство всех лицензий такого рода, и поделать с этим ничего нельзя. Более того, любой может расшифровать его содержимое и прочесть, чья это лицензия, какого она типа, когда выдана и т.д. Вы не можете зашифровать содержимое лицензии так, чтобы его никто не смог прочесть: раз ваша программа может его расшифовать (а она обязана это делать!), то и любой другой, приложив некоторые усилия, сможет это сделать. Но подделать лицензию, зашифрованную секретным ключом, практически невозможно (если ключ достаточно длинный). Интересно, что несложно придумать модификацию данного метода, в которой вся вышеуказанная информация хранится открытым текстом и лишь контрольная сумма шифруется секретным ключом, делая невозможным подделку (это называется цифровой подписью сообщения).

При появлении краденой лицензии в Internet вы можете включить в следующую версию своей программы проверку номера лицензии (пункт 1); это дает простой путь к отключению ворованных лицензий. Небольшое усовершенствование может включать шифровку номеров отключенных лицензий тем же открытым ключом, чтобы сделать невозможным исправление исполняемого файла на предмет убирания какого-либо номера из списка.

Каковы преимущества и недостатки такого подхода по сравнению с обычной проверкой соответствия имени пользователя и кода, основанной на некотором алгоритме? Во-первых, метод шифрования с открытым ключом не позволяет взломщику написать генератор лицензий (это главное преимущество). Во-вторых, вы имеете богатые возможности по управлению поведением программы, т.к. лицензия может содержать в себе довольно много информации. В третьих, легко отключать ворованные лицензии (вместо недействительных ключей, которые могут быть довольно длинными, достаточно хранить лишь номер лицензии -- целое число). Из недостатков следует отметить, во-первых, сравнительно большую длину лицензии (сотни или тысячи байт). Такие ключи придется рассылать и хранить в виде файла, запись их в системный реестр или конфигурационный файл программы будет, скорее всего, неуместной. Вторым недостатком является заметное время расшифровки (несущественная проблема при современных скоростях процессоров).

Еще одним интересным моментом является лицензирование программы, установленной на многопользовательском компьютере. Если программа не является системной, то она, скорее всего, будет выполняться с правами пользователя, а не администратора для минимизации риска. Это значит, что файл с лицензией будет доступен всем пользователям системы для чтения. Следовательно, чтобы предотвратить копирование файла пользователями (т.е. кражу лицензии), лицензию необходимо привязать, например, к сетевому имени компьютера. В рассмотренном методе лицензирования это делается достаточно просто, причем модифицирование этой информации в файле лицензии невозможно. Так реализуются доступные для чтения, но защищенные лицензии.

Заметим, что вопросы защиты от взлома в прямом смысле этого слова, т.е. модификации исполняемого кода программы, в данном случае не рассматривались.

Copyright (C) 1999-2000 Sergey Ayukov. No part of this text can be reproduced without permission.


return to essays | return to homepage | send comment