Ищем алгоритм лицензионного ключа

На Stack Overflow задают много вопросов, касающихся лицензионных ключей. Но они не отвечают на этот вопрос.

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

Алгоритм лицензионного ключа аналогичен шифрованию с открытым ключом. Мне просто нужно что-то простое, что можно реализовать на любой платформе .NET/Java и использовать простые данные, такие как символы.

Ответы, написанные в виде псевдокода, идеальны.

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

  1. Клиент загружает программное обеспечение, которое генерирует уникальный ключ при первоначальном запуске/установке.
  2. Программное обеспечение работает в течение пробного периода.
  3. По окончании пробного периода требуется ключ авторизации.
  4. Клиент переходит на указанный веб-сайт, вводит свой код и после оплаты получает код авторизации для включения программного обеспечения :)

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


person angryITguy    schedule 15.04.2010    source источник
comment
Я думаю, что ключ есть и не требует диплома по математике, чтобы понять, и его не так просто сломать, это бессмысленно , и в этом случае ответ, как правило, нет.   -  person Rex M    schedule 15.04.2010
comment
Не забудьте добавить, что это должно быть бесплатно и преподнесено вам на блюдечке с голубой каемочкой.   -  person President James K. Polk    schedule 15.04.2010
comment
@GregS. Это дух! LOL ... Я немного погуглил, и мне не удалось найти разумный алгоритм. Надеюсь, кто-то может сослаться на стоящую ссылку   -  person angryITguy    schedule 15.04.2010
comment
Спасибо анонимному трусу, который проголосовал против вопроса, несмотря на 15 голосов, 14 избранных и 21 голос за одобренный ответ. Я не возражаю, что модераторы сообщества пометили вопрос как не относящийся к теме...   -  person angryITguy    schedule 26.06.2015


Ответы (7)


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

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

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

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

person tylerl    schedule 15.04.2010
comment
Имя и дата покупки являются распространенной комбинацией. Когда они обновляются, вы должны сгенерировать новый ключ. Вы записываете имя открытого текста в файл, и время изменения файла также является частью хешированной строки, используемой для создания лицензионного ключа. - person S.Lott; 15.04.2010
comment
Алгоритм также должен иметь способ истечения срока действия. Хорошая идея, но не требуется для активации в том, что я делаю. - person angryITguy; 15.04.2010
comment
@giulio: вам не нужно реализовывать истечение срока действия. Но вы должны предоставить достаточно соли, чтобы ключ нельзя было угадать. Дата создания - стандартный вид соли. - person S.Lott; 15.04.2010
comment
@giulio: чтобы реализовать истечение срока действия, просто закодируйте дату начала и окончания в ключе продукта. - person tylerl; 16.04.2010
comment
Мне удалось придумать что-то довольно простое. В основном используется TEA ( en.wikipedia.org/wiki/Tiny_Encryption_Algorithm ) и комбинированный ключ, однозначно идентифицирующий Устройство. Я передаю ключевую информацию на сервер авторизации, используя кодировку base16. Я также включаю метку времени, если хочу включить ограничение по времени. - person angryITguy; 24.06.2011
comment
Как только кто-то поймет, как вы генерируете лицензионные ключи, он сможет сгенерировать свои собственные. - Только если ты облажался. Если ваш лицензионный ключ включает в себя цифровую подпись, знание того, как он генерируется, ни в малейшей степени не поможет автору ключей. Им еще предстоит взломать алгоритм цифровой подписи — достижение, достойное научной публикации! - person Roman Starkov; 29.09.2011
comment
@romkyns, если вы подписываете свой ключ закрытым ключом, да, это правда, но если вы просто хешируете значение (адрес электронной почты плюс что-то еще), то они могут начать генерировать ключи для любого адреса электронной почты, если они это проработали и алгоритм хеширования, который вы используете - person Paul Taylor; 01.09.2012

Я использую такую ​​систему:

• создать строку из лицензионного ключа Windows + дата окончания пробного периода

• генерировать хэш (Sha/md5) из строки

• преобразовать дату окончания пробного периода в целое число (например, количество дней)

• ключ становится датой окончания пробного периода + часть хэша

• преобразовать ключ только в символы верхнего регистра, чтобы облегчить ввод

ABCD-DEFG-HIJK...

проверка работает как

• снова преобразовать ключ в байты

• извлечь дату окончания пробного периода

• создать строку из лицензионного ключа Windows + дата окончания пробного периода

• хэш

• сравнить хэш с остальной частью ключа

это делает его достаточно сложным для моей аудитории.

person adrianm    schedule 15.04.2010
comment
Спасибо. Этот подход очень похож на то, над чем я работал. Мне нужно было включить ряд элементов, чтобы сделать его воспроизводимым и уникальным для установки с датами истечения срока действия и другой информацией. - person angryITguy; 16.11.2011

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

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

Вы можете проверить SoftActivate Licensing SDK, он использует криптографию на основе эллиптических кривых для создания коротких лицензионных ключей с цифровой подписью (доступен исходный код C++/C#).

person Kevin Levrone    schedule 15.11.2011
comment
Кроме того, если вы ищете SoftActivate в Интернете, вы можете найти кейгены для него. Это должно сказать вам, насколько это действительно полезно. - person Andrew Barber; 17.11.2011

Честно говоря, то, что вы пытаетесь сделать, бессмысленно. Сколько бы времени вам ни понадобилось, чтобы написать систему проверки/шифрования/ключей, по оценкам, примерно вдвое меньше, чем кто-то ее взломает. Даже если вы зашифруете окончательный исполняемый файл. Однако в качестве отсрочки или способа уменьшить вероятность того, что люди получат премиальную поддержку для украденных копий, это поможет. Также для простого отслеживания покупателей. Или для удовольствия. :п

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

hash = md5(name);

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

validCode = getCode(name);
hash = myHash(name ^ validCode);

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

sysID = processor_name() | ram_Speed();
hash = md5(sysID & name);

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

Надеюсь, это поможет с вашим вопросом.

person ssube    schedule 15.04.2010
comment
Стоит включить секрет в строку, которую нужно хэшировать. Любой злоумышленник может просто ввести MD5 свое собственное имя, добавив секрет (и используя более безопасный хеш, такой как SHA-2), что значительно усложнит задачу. Конечно, секрет должен быть включен в программное обеспечение и может быть извлечен. Соединение XOR с другой строкой (желательно похожей на строку, используемую в программе) поможет замаскировать ее. - person Martin; 06.08.2013

В вопросах безопасности отказ от повторного использования хорошо известного и проверенного алгоритма и попытка создания собственного (без математических знаний) является самоубийственным.

Раскрытие информации: мне совершенно не хватает математической степени для создания такого алгоритма, и, честно говоря, я лично не знаю никого, у кого бы он был

person Pablo Fernandez    schedule 15.04.2010
comment
Я просил псевдоалгоритм, который я мог бы адаптировать к стандартному языку программирования и использовать концепции строк. Я считаю, что это становится самоубийством, если вы начинаете делать переводы на уровне байтов. - person angryITguy; 15.04.2010
comment
У меня действительно степень по математике с основным изучением теории чисел (откуда уходят корни многие такого рода алгоритмы), и я полностью с этим согласен. - person Anthony Potts; 14.05.2010
comment
не использовать повторно известный и проверенный алгоритм и пытаться создать свой собственный ... разве не поэтому он спрашивает здесь? Знаете, чтобы не делать то, что вы ему говорите не делать. - person pc1oad1etter; 13.01.2012
comment
Да он просто спрашивает, как реализовать лицензирование по существующим алгоритмам, а не пытается создавать новые алгоритмы - person Paul Taylor; 01.09.2012

Поскольку любой алгоритм, который вы сделаете, сломается, я бы сделал что-то простое:

const string secretMumboJumbo = "sdfkldafskjlfajmkldsfjaewumaskldfladkkldsfklj"

//For you to generate keys
string GenerateLicenceKey(int idNr)
{
    return Sha1Hmac(key=secretMumboJumbo, messageToEncode=idNr)
}

//For clients to check if key is valid, 
bool IsKeyValid(string key)
{
   for(int i=0;i<maxNrOfLicenceKeys;i++)
      if(key == GenerateLicenceKey(i))
         return true;
   return false;
}

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

Большинство фреймворков должны иметь HMAC-функцию для SHA1 или какую-то другую хеш-функцию. В худшем случае вы можете заменить это на md5 (key + id)

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

person bleo    schedule 15.11.2011
comment
Спасибо, я изучил SHA-1 и обнаружил, что это значительный удар по производительности, md5 - вариант. Я изучал классы, написанные на чистом J2SE. Они не так безопасны, но улучшение производительности значительно. - person angryITguy; 16.11.2011
comment
@giulio Производительность хит? Сколько ключей вам нужно генерировать в секунду? Для пользователя, вводящего ключ, это однократное (или однократное при загрузке) событие. Для их создания ... ну, я бы хотел заниматься бизнесом по продаже программного обеспечения, где генерация ключей становится проблемой производительности. Многие алгоритмы генерации ключей намеренно плохо работают, чтобы предотвратить атаки грубой силы. Однако это снижение производительности обычно становится узким местом только в том случае, если вы... выполняете атаки грубой силы. - person Martin; 06.08.2013

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

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

person Natalie Adams    schedule 09.08.2010
comment
Я могу получить уникальную информацию из технической среды пользователей, которая идет на создание их ключей. Поэтому, если кто-то еще намеревается его использовать, система выполняет проверку, останавливает и запрашивает действительный ключ в зависимости от новой среды, в которой она пытается работать. Да, вы можете взломать самые сложные системы лицензирования, когда-либо созданные. Microsoft пробовала и потерпела неудачу, и у них есть все, чтобы бросить это. Но это действительно барьер для случайного пиратства. Если кто-то действительно хочет взломать его, он это сделает. Но этот риск довольно низок, учитывая, для чего предназначено программное обеспечение и для какого целевого рынка. - person angryITguy; 10.08.2010