Как программные лицензионные ключи сгенерированы?

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

349
задан Jarek 2 August 2018 в 15:38
поделиться

8 ответов

Для ключей 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 - используемый, например, при покупке игровых карт - вероятно, выглядит примерно так:

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

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

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

262
ответ дан 23 November 2019 в 00:28
поделиться

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

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

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

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

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

17
ответ дан 23 November 2019 в 00:28
поделиться

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

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

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

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

enter image description here

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

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

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

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

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

55
ответ дан 23 November 2019 в 00:28
поделиться

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

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

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

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

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

21
ответ дан 23 November 2019 в 00:28
поделиться

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

По сути, у вас есть некий нецелевой ключ и фиксированная подпись.

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

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

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

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

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

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

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

10
ответ дан 23 November 2019 в 00:28
поделиться

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

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

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

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

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

1
ответ дан 23 November 2019 в 00:28
поделиться

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

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

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

1
ответ дан 23 November 2019 в 00:28
поделиться

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

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

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

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

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

9
ответ дан 23 November 2019 в 00:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: