Каков хороший подход для разработки простого генератора / верификатора серийного номера?

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

  • Простая комбинация цифра / буква длиной не более 25-30 буквенно-цифровых символов (например, ключи продукта Microsoft)
  • Не требует от пользователя вводить какую-либо личную информацию (например, адрес электронной почты) как часть проверки

Я думал об этом (очень мало) и думаю, что криптография с открытым ключом - хорошее место для начала. Я мог бы сгенерировать строку, которая идентифицирует лицензию (например, встроенный серийный номер SKU + plain ole), хэширует ее, шифрует и кодирует серийный номер + идентификатор в 25-значный (или около того) буквенно-цифровой ключ. Затем приложение будет декодировать ключ в серийный номер и "подпись", генерировать хеш идентификатора, расшифровывать "подпись" с использованием соответствующего открытого ключа и сравнивать его с сгенерированным хешем идентификатора.

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

Что касается реализации, приложение написано на Objective-C для Mac OS X, но, учитывая то, насколько просто внедрить код в приложения Cocoa, я, вероятно, напишу проверочный код прямо на C.

5 ответов

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

Я хотел бы сделать следующее - взять, скажем, 25-значный номер. Теперь добавьте несколько правил, таких как: - число должно делиться на 31 - оно должно начинаться и заканчиваться последней буквой...

Всегда генерируйте ключи, используя эти правила. Используйте 20 или более правил (чем больше, тем лучше). При развертывании приложения используйте меньшее количество правил, например, 10, чтобы проверить, является ли ключ действительным. Эти правила затем будут разобраны и использованы для создания keygen.

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

Мне нравится метод @bh213, однако он не помешает исправлению ключей при обновлении правил для серийных номеров.

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

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

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

Поскольку Redbeard 0x0A верен, CD-ключи должны быть честными для честных клиентов. Просто нужно немного сложнее купить ваш продукт, чем найти кейген.

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

Последовательная схема может быть очень простой:

  1. Иметь большой последовательный пробел (25 буквенно-цифровых символов - это около 1044, но просто используйте последовательный файл и сделайте 80 символов x 16 строк для пробела ключа 102311)
  2. Выберите несколько правил, чтобы уменьшить количество действительных серийных номеров в 100 раз по сравнению с тем, что, по вашему мнению, вы продадите в своих самых смелых мечтах.

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

На sigpipe.macromates.com есть запись в блоге, в которой объясняется, как использовать криптографический ключ с открытым / открытым ключом для проверки серийного номера. Это может проверить, что пользователь и Serialnumber совпадают. (Подписание / Проверка). Я бы, наверное, добавил немного соли, просто чтобы быть уверенным.

Поскольку этот пост относится к 2004 году, вы должны рассмотреть рекомендуемую длину ключа на http://www.keylength.com/.

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

При этом я написал библиотеку для такого рода вещей, которая будет использоваться в моих приложениях на основе шифрования AES. Я продаю его за 25 долларов, и он использует парольную фразу и соль, чтобы сделать ваш серийный номер уникальным. Если вы заинтересованы, вы можете найти его здесь: http://simpleserials.com/

Другие вопросы по тегам