Лицензионные ключи являются defacto-стандартом как антипиратской мерой. Честно говоря, это кажется мне (в) безопасности Через Мрак, хотя я действительно понятия не имею, как сгенерированы лицензионные ключи. Что такое хороший (безопасный) пример поколения лицензионного ключа? Какой криптографический примитив (если таковые имеются) они используют? Действительно ли это - дайджест сообщения? Если так, какие данные они хешировали бы? Какие методы разработчики используют, чтобы мешать взломщикам создавать их собственные ключевые генераторы? Как ключевые генераторы сделаны?
Для ключей CD старой школы нужно было просто составить алгоритм, для которого ключи CD (которая может быть любой строкой) легко генерировать и легко проверять, но соотношение Количество действительных ключей компакт-диска на недействительные ключи компакт-диска настолько мало, что случайное угадывание ключей компакт-диска вряд ли даст вам действительный.
Starcraft и Half-life использовали одну и ту же контрольную сумму, где 13-я цифра проверяла первые 12.Таким образом, вы можете ввести что угодно для первых 12 цифр и угадать 13-ю (есть только 10 вариантов), что приведет к печально известному 1234-56789-1234
Алгоритм проверки является общедоступным и выглядит примерно так :
x = 3;
for(int i = 0; i < 12; i++)
{
x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;
Windows XP берет довольно много информации, шифрует ее и помещает буквенно-цифровую кодировку на наклейку. Это позволило MS проверить ваш ключ и одновременно получить тип продукта (Домашний, Профессиональный и т. Д.). Кроме того, требуется онлайн-активация.
Полный алгоритм довольно сложен, но хорошо изложен в , этой (полностью законной!) Статье, опубликованной в Германии.
Конечно, что бы вы ни делали, если только вы не предлагаете онлайн-сервис (например, World of Warcraft ), любой тип защиты от копирования - это просто лабиринт: к сожалению, если это какая-то игра, имеющая ценность , кто-то нарушит (или, по крайней мере, обойдет) алгоритм CD-ключа и все другие средства защиты авторских прав.
Для онлайн-сервисов жизнь немного проще, поскольку даже с двоичным файлом вам необходимо пройти аутентификацию на их серверах, чтобы использовать его (например, иметь аккаунт WoW). Алгоритм CD-ключа для World of Warcraft - используемый, например, при покупке игровых карт - вероятно, выглядит примерно так:
- Генерация очень большого криптографически безопасного случайного числа.
- Сохраните его в нашей базе данных и распечатайте на карте.
Затем, когда кто-то вводит номер игровой карты, проверьте, есть ли он в базе данных, и, если это так, свяжите этот номер с текущим пользователем, чтобы его больше нельзя было использовать.
Для онлайн-сервисов нет причин не использовать вышеуказанную схему; использование чего-либо еще может привести к проблемам .
CD-ключи не обеспечивают большой защиты для любого несетевого материала, поэтому технически их не нужно создавать безопасно. Если вы используете .net, вы можете почти использовать Guid.NewGuid ().
В настоящее время они в основном используются для компонента многопользовательской игры, где сервер может проверить ключ компакт-диска. Для этого неважно, насколько безопасно он был сгенерирован, поскольку он сводится к «поиску всего, что передается, и проверке, не использует ли кто-то это уже».
При этом вы можете использовать алгоритм для достижения двух целей:
При этом вам по-прежнему нужно большое распределение и некоторая случайность, чтобы пират не угадал действительный ключ (который действителен в вашей базе данных, но все еще находится в коробке на полке магазина) и обманул законного клиента, который случайно купи эту коробку.
Когда я изначально писал этот ответ, предполагалось, что вопрос касался «автономной» проверки лицензионных ключей. Большинство других ответов касаются онлайн-проверки, с которой значительно проще справиться (большая часть логики может быть выполнена на стороне сервера).
При автономной проверке самое сложное - это убедиться, что вы можете сгенерировать огромное количество уникальных лицензионных ключей и при этом поддерживать надежный алгоритм, который нелегко скомпрометировать (например, простую контрольную цифру).
Я не очень хорошо разбирается в математике, но меня поразило, что один из способов сделать это - использовать математическую функцию , которая строит график
Построенная линия может иметь (если вы используете достаточно точную частоту) тысячи уникальные точки, поэтому вы можете генерировать ключи, выбирая случайные точки на этом графике и кодируя значения каким-либо образом
В качестве примера мы построим этот график, выберем четыре точки и закодируем их в строку как «0, -500 ; 100, -300; 200, -100; 100,600 "
Мы зашифруем строку известным и фиксированным ключом (ужасно слабым, но он служит определенной цели), а затем преобразуем полученные байты через Base32 , чтобы сгенерировать окончательный ключ
. Затем приложение может обратить этот процесс (base32 в действительное число, расшифровать, декодировать точки), а затем проверьте, что каждая из этих точек находится на нашем секретном графике.
Это довольно небольшой объем кода, который позволяет сгенерировать огромное количество уникальных и действительных ключей.
Тем не менее, это очень большая защита от неизвестности. Любой, кто потратит время на дизассемблирование кода, сможет найти функцию построения графика и ключи шифрования, а затем смоделировать генератор ключей, но это, вероятно, весьма полезно для замедления случайного пиратства.
У меня нет опыта в том, что люди на самом деле делают для генерации ключей компакт-дисков, но (при условии, что вы не хотите идти по пути онлайн-активации) вот несколько способов: может составить ключ:
Требовать, чтобы число делилось (скажем) на 17. Угадать несложно, если у вас есть доступ ко многим ключам, но большинство потенциальных строк будет недействительным. Аналогичным образом потребовалось бы, чтобы контрольная сумма ключа соответствовала известному значению.
Требовать, чтобы первая половина ключа, связанная с известным значением, хешировала до второй половины ключа. Лучше, но программа по-прежнему содержит всю информацию, необходимую для генерации ключей, а также для их проверки.
Сгенерировать ключи путем шифрования (закрытым ключом) известного значения + одноразового номера. Это можно проверить, расшифровав с помощью соответствующего открытого ключа и проверив известное значение. Теперь программа имеет достаточно информации для проверки ключа, не имея возможности генерировать ключи.
Они все еще открыты для атак: программа все еще существует и может быть исправлена, чтобы обойти проверку. Возможно, более умным было бы зашифровать часть программы, используя известное значение из моего третьего метода, вместо того, чтобы сохранять значение в программе.Таким образом, вам нужно будет найти копию ключа, прежде чем вы сможете расшифровать программу, но она по-прежнему уязвима для копирования после расшифровки и для того, чтобы один человек взял свою законную копию и использовал ее, чтобы позволить всем остальным получить доступ к программному обеспечению.
Если вас не особенно волнует длина ключа, то довольно проверенным и верным методом является использование открытого и закрытого ключей шифрования.
По сути, у вас есть некий нецелевой ключ и фиксированная подпись.
Например: 0001-123456789
Где 0001 - ваш nonce, а 123456789 - ваша фиксированная подпись.
Затем зашифруйте это, используя ваш закрытый ключ, чтобы получить ключ CD, который выглядит примерно так: ABCDEF9876543210
Затем распространите открытый ключ вместе с вашим приложением. Открытый ключ можно использовать для расшифровки CD-ключа "ABCDEF9876543210", которым вы затем проверяете часть фиксированной подписи.
Таким образом, никто не сможет догадаться, какой CD-ключ используется для неса 0002, поскольку у него нет закрытого ключа.
Единственным существенным недостатком является то, что ваши CD-ключи будут довольно длинными при использовании закрытых / открытых ключей размером 1024 бита. Вам также нужно выбрать достаточно длинный nonce, чтобы вы не шифровали тривиальный объем информации.
Плюс в том, что этот метод будет работать без "активации", и вы можете использовать такие вещи, как адрес электронной почты или имя лицензиата в качестве nonce.
Все алгоритмы защиты от копирования только для компакт-дисков причиняют неудобства честным пользователям, не обеспечивая при этом никакой защиты от пиратства.
«Пирату» нужен только доступ к одному легитимному компакт-диску и коду доступа к нему, после чего он может сделать n копий и распространить их.
Неважно, насколько криптографически защищенным вы делаете код, вам необходимо предоставить его вместе с компакт-диском в виде обычного текста, иначе законный пользователь не сможет активировать программное обеспечение.
Наиболее безопасные схемы предполагают, что либо пользователь предоставляет поставщику программного обеспечения некоторые сведения о машине, на которой будет запущено программное обеспечение (серийные номера ЦП, MAC-адреса, IP-адрес и т. Д.), Либо требуется онлайн-доступ для регистрации программного обеспечения на веб-сайт поставщиков и взамен получают токен активации. Первый вариант требует большого количества ручного администрирования и того стоит только для очень дорогостоящего программного обеспечения, второй вариант может быть подделан и совершенно бесит, если у вас ограниченный доступ к сети или вы застряли за брандмауэром.
В целом, установить доверительные отношения со своими клиентами намного проще!
Есть также поведение DRM, которое включает в себя несколько этапов процесса. Один из наиболее известных примеров - это один из методов Adobe для проверки установки Creative Suite. Используется традиционный метод CD Key, обсуждаемый здесь, затем вызывается линия поддержки Adobe. Ключ компакт-диска передается представителю Adobe, и они возвращают ему номер активации, который будет использоваться пользователем.
Однако, несмотря на то, что он разбит на этапы, он становится жертвой тех же методов взлома, которые используются в обычном процессе. Процесс, используемый для создания ключа активации, который сравнивается с исходным ключом компакт-диска, был быстро обнаружен, и были созданы генераторы, включающие оба ключа.
Однако этот метод по-прежнему существует как способ проверки продукта для пользователей без подключения к Интернету. Забегая вперед, легко увидеть, как эти методы будут устранены, когда доступ в Интернет станет повсеместным.
Система ключей должна иметь несколько свойств:
Одно из решений, которое должно дать вам это, - это использовать схему подписи открытого ключа . Начните с «системного хеша» (скажем, возьмите макинтоши на любых сетевых адаптерах, отсортируйте и укажите информацию об идентификаторе процессора, а также некоторые другие вещи, объедините все это вместе и возьмите MD5 результата (вы действительно не хотите, чтобы обработка личной информации , если вам не нужно)) добавить серийный номер компакт-диска и отказаться от загрузки, если какой-либо ключ реестра (или некоторый файл данных) не имеет действительной подписи для большого двоичного объекта. Пользователь активирует программу, отправляя вам большой двоичный объект, а вы отправляете подпись обратно.
Возможные проблемы включают в себя то, что вы предлагаете подписать практически все, поэтому вам нужно предположить, что кто-то проведет атаку выбранный простой текст и / или выбранный зашифрованный текст . Это можно смягчить, проверив предоставленный серийный номер и отказавшись обрабатывать запросы от недействительных, а также отказавшись обрабатывать более заданного количества запросов от данного серийного номера за интервал (скажем, 2 в год)
I Следует указать на несколько моментов: Во-первых, опытный и решительный злоумышленник сможет обойти любую безопасность в тех частях, к которым у него есть неограниченный доступ ( т.е. все на компакт-диске), как можно лучше сделать для этой учетной записи труднее получить незаконный доступ, чем получить законный доступ. Во-вторых, я не эксперт, поэтому в предлагаемой схеме могут быть серьезные недостатки.