Форум программистов, компьютерный форум CyberForum.ru

Генерация и проверка серийного номера, как реализовать? - C++

Восстановить пароль Регистрация
 
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 259
13.07.2015, 17:27     Генерация и проверка серийного номера, как реализовать? #1
Мне нужно, скажем так, защитить программу - написать функцию генерации и проверки уникального серийного номера для каждой копии программы. Пока не совсем понимаю, в каком направлении копать. Я знаю, что как-то можно получить ID процессора или винчестера и отталкиваться от этого. (А если, скажем программа на виртуалке будет запущена, то id оборудования там будут одинаковые?)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2015, 17:27     Генерация и проверка серийного номера, как реализовать?
Посмотрите здесь:

Как заменить русские символы на их номера в алфавите? C++
Заменить отрицательные элементы суммой номера столбца и номера строки, в которых они находятся C++
Меню в консольном режиме.Текстовую с вводом номера строки, которую надо реализовать C++
Как заменить определенный символ на номера попорядку? C++
незнаю как вывести полное решение для задачки.смысл улавливаю, а как реализовать - туплю C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
13.07.2015, 18:14     Генерация и проверка серийного номера, как реализовать? #2
Надо сразу иметь в виду, что такая защита - штука ненадёжная. Если кому-то понадобится, её легко снимут. К тому же, цепь прочна настолько, насколько прочно её слабейшее звено. Попадалась мне одна программа ценой под тысячу долларов с лицензионной схемой, использующей мощную криптографию, но привязанной к Volume ID диска C. И когда мне надо было перенести эту лицензию на виртуальную машину, я попросту поменял там Volume ID на нужный при помощи маленькой программульки, скачанной с сайта microsoft.com. Вот вам и криптография.

После этих прелиминариев, перейдём всё же к теории.
Для простоты будем использовать в качестве идентификатора тот самый Volume ID, который я опустил ниже плинтуса в предыдущем абзаце. Получить его можно при помощи функции GetVolumeInformation.
От этого идентификатора (и/или других, более надёжных) берём хэш (не абы какой, криптографический - SHA3, например).
В поставке программы должен идти открытый ключ. Соответствующий ему закрытый ключ хранится у автора программы. Эта пара может быть одинаковой для всех экземпляров программы или индивидуальная для каждого клиента.
При регистрации автор получает идентификатор машины (тот самый хэш) и зашифровывает его своим закрытым ключом, результат - серийник, который отсылается пользователю.
Проверка серийника на стороне клиента: собирается идентификационная информация, от неё берётся хэш и сравнивается с результатом расшифровки серийника открытым ключом. Если совпало - серийник правильный. Естественно, атакующие первым делом нацелятся на эту часть алгоритма и попробуют сделать так, чтобы проверка считала правильным любой серийник.

Цитата Сообщение от young_snake Посмотреть сообщение
А если, скажем программа на виртуалке будет запущена, то id оборудования там будут одинаковые?
По обстоятельствам. В разных копиях одной и той же виртуальной машины (которые можно рассеять по любому количеству реальных машин) - да. В разных виртуальных машинах обычно идентификаторы разные (тот же Volume ID, к примеру, генерируется случайным образом во время форматирования диска).
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 259
13.07.2015, 18:20  [ТС]     Генерация и проверка серийного номера, как реализовать? #3
Хорошо, а как примерно реализовать такой подход с ассиметричной криптографией? И как можно обойтись без него? Как в большинства программах, где ты берешь какой-нибудь код, который тебе выдает софт, и на основе его получаешь у автора серийник.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
13.07.2015, 18:33     Генерация и проверка серийного номера, как реализовать? #4
Цитата Сообщение от young_snake Посмотреть сообщение
Хорошо, а как примерно реализовать такой подход с ассиметричной криптографией?
Взять хорошую проверенную криптографическую библиотеку и реализовать серверную и клиентскую части защиты.
Цитата Сообщение от young_snake Посмотреть сообщение
И как можно обойтись без него?
Можно упрощать приведённую мной схему. Заменить асимметричное шифрование симметричным. Заменить надёжное шифрование простым самопальным. Заменить криптографический хеш на что-то попроще из стандартных, сделать самопальный хеш, отказаться от хеширования вообще.
Каждый из этих шагов серьёзно упростит атакующему анализ защиты и создание генератора ключей.
В конечном итоге можно прийти к простейшей схеме вроде той, что десятилетиями использует Джефф Фогель: серийник вычисляется из VolumeID несколькими арифметическими операциями. То, что даже не генераторы, а просто формулы для генерации ключей, которые можно вбить в Excel и пользоваться, появляются в день выхода его продуктов, его не особо заботит: он полагается в основном на совесть пользователей (а в последнее время - на системы цифровой дистрибуции вроде Apple Store). Иными словами, он вкладывает в защиту ровно столько усилий, чтобы она считалась наличествующей с юридической точки зрения и ни капли больше (как я подозреваю, это несколько минут для каждой новой игры). И нельзя сказать, чтобы этот подход был лишён здравого смысла. Хоть он и не рассекает океаны на личной позолоченной яхте, с голоду не умер.
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 259
13.07.2015, 18:50  [ТС]     Генерация и проверка серийного номера, как реализовать? #5
А если сделать генерацию ключа на основе имени/е-мейла? Тогда уже проблема с ИД тома не так страшна?
Kurles
154 / 119 / 29
Регистрация: 30.05.2015
Сообщений: 373
13.07.2015, 18:54     Генерация и проверка серийного номера, как реализовать? #6
Цитата Сообщение от young_snake Посмотреть сообщение
А если сделать генерацию ключа на основе имени/е-мейла? Тогда уже проблема с ИД тома не так страшна?
Тогда копию программы можно будет вообще на любой машине развернуть, имея ключ, сгенерированный на основе имени/е-мейла
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 259
13.07.2015, 18:56  [ТС]     Генерация и проверка серийного номера, как реализовать? #7
Ну да, получается что так. А какие константы тогда использовать? ID процессора, например?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
13.07.2015, 18:58     Генерация и проверка серийного номера, как реализовать? #8
Цитата Сообщение от young_snake Посмотреть сообщение
А если сделать генерацию ключа на основе имени/е-мейла? Тогда уже проблема с ИД тома не так страшна?
Не думаю, что эта проблема вообще страшна. Надо просто отдавать себе отчёт, что сама по себе такая схема защиты может быть и будет взломана, если сама программа хоть кому-то нужна. И неважно, к чему привязываемся.
Ну а генерация серийников на основе имени/почты - вполне популярная схема. Так же как и распространение серийных номеров в паре с именем/почтой. И как распространение кейгенов, вычисляющих серийник по этим данным.
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 259
13.07.2015, 19:09  [ТС]     Генерация и проверка серийного номера, как реализовать? #9
Ну а примерная схема какова? Я беру HWID (например конкатенирую id винта и процессора - они хранятся как массив символов, я так понимаю?), потом например генерирую последовательность: складываю вместе код первого и третьего символа, второго и четвертого и так далее. В каждом случае на выходе получаю WORD( char + char то есть), потом, например, прохожусь по этим вордам и превращаю их побайтово в char, а если код выходит за границы ascii таблицы то как-то привожу его к коду в ее пределах. Я сам не совсем еще концепцию понял. В общем, вопрос в том, как из HWID сгенерировать цифро-буквенную последовательность серийника, а потом ее проверить. То есть пример алгоритма нужен.
Kurles
154 / 119 / 29
Регистрация: 30.05.2015
Сообщений: 373
13.07.2015, 19:32     Генерация и проверка серийного номера, как реализовать? #10
Один из вариантов (упрощённый):
шаг один: на машине, для которой выполняем активацию, вычисляем
C
1
tmp1 = md5(id_hdd + id_cpu)
и отправляем нам вместе с именем пользователя. Затем у себя вычисляем
C
1
tmp2 = md5(tmp1 + user_name)
от tmp2 берём первые 16 символов - вот он наш ключ, отдаём его пользователю.

Теперь, когда пользователь на своей машине введёт своё имя и полученный ключ, значение на шаге два (первые 16 символов) должно совпасть с ключом. Вуаля, аутентификация пройдена :) На другой же машине с отличными id_hdd и id_cpu - фиг.
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 259
13.07.2015, 20:16  [ТС]     Генерация и проверка серийного номера, как реализовать? #11
Спасибо, наглядно, а без хеш-функций, исключительно манипулируя идентификаторами цпу и винчестера вручную?
Kurles
154 / 119 / 29
Регистрация: 30.05.2015
Сообщений: 373
13.07.2015, 21:35     Генерация и проверка серийного номера, как реализовать? #12
Цитата Сообщение от young_snake Посмотреть сообщение
Спасибо, наглядно, а без хеш-функций, исключительно манипулируя идентификаторами цпу и винчестера вручную?
По образу и подобию, свой вариант хеш-функции написать. Только есть ли смысл? Вот к примеру одна из
реализаций без использования сторонних библиотек.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2015, 15:17     Генерация и проверка серийного номера, как реализовать?
Еще ссылки по теме:

C++ Указатель на имя файла как аргумент функции. Как реализовать?
Как работает генерация случайных чисел в приведенном коде C++
C++ Периодическая генерация событий сообщений окну - как реализовать?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 259
14.07.2015, 15:17  [ТС]     Генерация и проверка серийного номера, как реализовать? #13
Я не совсем это имел в виду. Я подразумевал какие-нибудь битовые операции, чтобы сначала получить HWID, который будет пользователю показан, и опять же какие-то операции над этим HWID чтобы сгенерировать и проверить серийник.
Yandex
Объявления
14.07.2015, 15:17     Генерация и проверка серийного номера, как реализовать?
Ответ Создать тему
Опции темы

Текущее время: 00:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru