Как генерируются лицензионные ключи программного обеспечения? - PullRequest
347 голосов
/ 09 июня 2010

Лицензионные ключи являются стандартом де-факто в качестве меры борьбы с пиратством. Честно говоря, это выглядит как (in) Security Through Obscurity , хотя я действительно не знаю, как создаются лицензионные ключи. Что является хорошим (безопасным) примером генерации лицензионного ключа? Какой криптографический примитив (если есть) они используют? Это дайджест сообщения? Если да, то какие данные они будут хэшировать? Какие методы используют разработчики, чтобы затруднить взломщикам создание собственных генераторов ключей? Как создаются генераторы ключей?

Ответы [ 9 ]

261 голосов
/ 16 июня 2010

Для старых CD-ключей это был всего лишь вопрос создания алгоритма, для которого CD-ключи (которые могут быть любой строкой) легко генерировать и легко проверять, но соотношение действительных CD-ключей к invalid-CD-keys настолько мал, что случайное угадывание 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-ключа и все другие средства защиты авторских прав.

REAL ПРАВИЛЬНЫЙ СПОСОБ ЭТОГО ДЕЛАТЬ:

Для онлайн-сервисов жизнь немного проще, поскольку даже с двоичным файлом вам необходимо пройти аутентификацию на их серверах, чтобы использовать его (например, иметь учетную запись WoW). Алгоритм CD-ключа для World of Warcraft, используемый, например, при покупке игровых карт, выглядит примерно так:

  1. Создание очень большого криптографически безопасного случайного числа.
  2. Сохраните его в нашей базе данных и распечатайте на карточке.

    Затем, когда кто-то вводит номер игровой карты, проверьте, находится ли он в базе данных, и, если он есть, свяжите этот номер с текущим пользователем, чтобы его никогда нельзя было использовать снова.

Для онлайн-сервисов нет причин для использования вышеуказанной схемы; использование чего-либо еще может привести к проблемам .

54 голосов
/ 10 июня 2010

Когда я изначально писал этот ответ, предполагалось, что вопрос касался «автономной» проверки лицензионных ключей.Большинство других ответов касаются онлайновой проверки, с которой значительно проще справиться (большую часть логики можно выполнить на стороне сервера).

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

Я не очень хорошо разбираюсь в математике, но меня поразило, что один из способов сделать это -используйте математическую функцию , которая строит график

Построенная линия может иметь (если вы используете достаточно точную частоту) тысячи уникальных точек, поэтому вы можете генерировать ключи, выбирая случайные точки на этомграфик и кодирование значений некоторым образом

enter image description here

В качестве примера, мы построим этот график, выберем четыре точки и закодируем в строку как «0, -500; 100, -300; 200, -100; 100,600 "

Мы зашифруем строку с помощью известного и фиксированного ключа (ужасно слабый, но он служит цели), затем выполнимПолучите итоговые байты через Base32 , чтобы сгенерировать окончательный ключ

Затем приложение может обратить этот процесс в обратном порядке (от base32 к действительному числу, расшифровать, декодировать точки), а затем проверить каждую из этих точек:на нашем секретном графике.

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

Тем не менее, он очень надежен для безопасности.Любой, кто потратит время на дизассемблирование кода, сможет найти графическую функцию и ключи шифрования, а затем смоделировать генератор ключей, но это, вероятно, весьма полезно для замедления случайного пиратства.

31 голосов
/ 31 октября 2010

Проверьте эту статью в Проверка частичного ключа , которая охватывает следующие требования:

  • Лицензионные ключи должны быть достаточно простыми для ввода.

  • Мы должны иметь возможность занести в черный список (отозвать) лицензионный ключ в случае возврата платежей или покупок с использованием украденных кредитных карт.

  • Нет «звонка домой» для проверки ключей,Хотя эта практика становится все более и более распространенной, я все еще не ценю ее как пользователя, поэтому не буду просить моих пользователей мириться с ней.

  • Это не должно быть возможно длявзломщик, чтобы разобрать наше выпущенное приложение и создать из него работающий «кейген».Это означает, что наше приложение не будет полностью проверять ключ для проверки.Только некоторые из ключей должны быть проверены.Кроме того, каждый выпуск приложения должен проверять отдельную часть ключа, чтобы фальшивый ключ, основанный на более раннем выпуске, не работал на более позднем выпуске нашего программного обеспечения.

  • Важно: для легитимного пользователя не должно быть возможности случайно ввести неверный ключ, который будет работать, но не получится в будущей версии из-за опечатки.

21 голосов
/ 09 июня 2010

У меня нет опыта в том, что люди на самом деле делают для создания ключей CD, но (при условии, что вы не хотите идти по пути онлайн-активации), вот несколько способов, которыми можно сделать ключ:

  • Требовать, чтобы число делилось на (скажем) 17. Тривиально угадать, если у вас есть доступ ко многим ключам, но большинство потенциальных строк будут недействительными.Аналогичным образом может потребоваться, чтобы контрольная сумма ключа соответствовала известному значению.

  • Требуется, чтобы первая половина ключа при объединении с известным значением хэшировалась до второй половиныключ.Лучше, но программа по-прежнему содержит всю информацию, необходимую для генерации ключей, а также для их проверки.

  • Генерация ключей путем шифрования (с помощью закрытого ключа) известного значения + nonce.Это можно проверить, расшифровав с использованием соответствующего открытого ключа и проверив известное значение.Теперь в программе достаточно информации для проверки ключа без возможности генерации ключей.

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

17 голосов
/ 10 июня 2010

CD-ключи не слишком безопасны для любых не связанных с сетью вещей, поэтому технически их не нужно создавать безопасно. Если вы находитесь на .net, вы можете почти использовать Guid.NewGuid ().

В настоящее время их основное использование - многопользовательский компонент, где сервер может проверить ключ CD. Для этого неважно, насколько надежно он был сгенерирован, поскольку сводится к «Найти все, что было передано, и проверить, не использует ли это кто-то еще».

При этом вы можете использовать алгоритм для достижения двух целей:

  • Имейте контрольную сумму некоторого вида. Это позволяет вашему установщику отображать сообщение «Ключ не кажется действительным», исключительно для обнаружения опечаток (добавление такой проверки в установщик фактически означает, что написание генератора ключей является тривиальной задачей, поскольку хакер имеет весь код, который ему необходим. проверка и только полагаясь на проверку на стороне сервера отключает эту проверку, рискуя раздражать ваших законных клиентов, которые не понимают, почему сервер не принимает их ключ CD, поскольку они не знают об опечатке)
  • Работа с ограниченным подмножеством символов. Попытка набрать ключ CD и угадать: "Это 8 или B? 1 или I? Q или O или 0?" - используя набор нецифровых символов / цифр, вы устраняете эту путаницу.

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

10 голосов
/ 21 июня 2010

Если вас не особо волнует длина ключа, довольно проверенным и верным методом является использование шифрования с открытым и закрытым ключом.

По сути, имеет какой-то одноразовый номер и фиксированную подпись.

Например: 0001-123456789

Где 0001 - ваш одноразовый номер, а 123456789 - ваша фиксированная подпись.

Затем зашифруйте это, используя свой закрытый ключ, чтобы получить ключ CD, который выглядит примерно так: ABCDEF9876543210

Затем распространите открытый ключ вместе с вашим приложением. Открытый ключ можно использовать для расшифровки ключа CD "ABCDEF9876543210", который затем вы проверяете с помощью фиксированной части подписи.

Это тогда не позволяет кому-либо угадать, что такое ключ CD для одноразового номера 0002, потому что у него нет личного ключа.

Единственный существенный недостаток в том, что ваши ключи CD будут довольно длинными при использовании закрытых / открытых ключей размером 1024-бит. Вам также нужно выбрать одноразовый номер достаточно долго, чтобы не шифровать тривиальный объем информации.

Положительным моментом является то, что этот метод будет работать без "активации", и вы можете использовать такие вещи, как адрес электронной почты или имя лицензиата в качестве одноразового номера.

9 голосов
/ 21 июня 2010

Система ключей должна иметь несколько свойств:

  • очень немногие ключи должны быть действительными
  • действительные ключи не должны быть выводимыми даже с учетом всего, что имеет пользователь.
  • действительный ключ в одной системе не является действительным ключом в другой.
  • другие

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

Потенциальные проблемы включают в себя то, что вы предлагаете подписать практически все, поэтому вам нужно предположить, что кто-то проведет выбранный простой текст и / или выбранный зашифрованный текст атак. Этого можно избежать, проверив предоставленный серийный номер и отказавшись обрабатывать запрос от недействительных, а также отказавшись обрабатывать больше, чем заданное количество запросов из заданного s / n в интервале (скажем, 2 в год)

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

1 голос
/ 22 июня 2010

Все компакт-диски только с алгоритмами защиты от копирования доставляют неудобства честным пользователям, не обеспечивая никакой защиты от пиратства.

«Пирату» нужно иметь доступ только к одному легитимному компакт-диску и его коду доступа, после чего он может сделать n копий и распространить их.

Неважно, насколько криптографически безопасным вы создаете код, вам необходимо предоставить его с компакт-диском в виде обычного текста, иначе законный пользователь не сможет активировать программное обеспечение.

В большинстве безопасных схем используется либо пользователь, предоставляющий поставщику программного обеспечения некоторые сведения о машине, на которой будет запускаться программное обеспечение (серийные номера процессора, MAC-адреса, IP-адрес и т. Д.), Либо требуется онлайн-доступ для регистрации программного обеспечения на сайт поставщиков и взамен получить токен активации. Первый вариант требует много ручного администрирования и стоит только для очень дорогого программного обеспечения, второй вариант может быть подделан и совершенно бесит, если у вас ограниченный доступ к сети или вы застряли за брандмауэром.

В целом гораздо проще установить доверительные отношения с вашими клиентами!

1 голос
/ 21 июня 2010

Существует также поведение DRM, которое включает в себя несколько этапов процесса.Одним из наиболее известных примеров является один из методов Adobe для проверки установки их Creative Suite.Здесь используется традиционный метод CD Key, затем вызывается линия поддержки Adobe.Ключ CD предоставляется представителю Adobe, и он возвращает номер активации, который будет использоваться пользователем.

Однако, несмотря на то, что он разбит на этапы, он становится жертвой тех же методов взлома, которые использовались длянормальный процесс.Процесс, использованный для создания ключа активации, который сверяется с оригинальным ключом CD, был быстро обнаружен, и были созданы генераторы, включающие оба ключа.

Однако этот метод все еще существует как способ для пользователей безподключение к интернету для проверки продукта.В дальнейшем легко увидеть, как эти методы будут устранены, когда доступ в Интернет станет повсеместным.

...