Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 263
#1

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

13.07.2015, 17:27. Просмотров 1763. Ответов 12
Метки нет (Все метки)

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

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

Проверка номера элемента массива на простоту
Дан массив вещественных чисел.Необходимо вывести сумму чисел, порядковые номера...

Алгоритм Луна (Проверка корректности номера банковской карты)
Не могу найти никак программу на с++ в которую я бы вводила номер карты и...

Алгоритм Луна (Проверка корректности номера банковской карты)
Не могу найти никак программу на с++ в которую я бы вводила номер карты и...

Меню в консольном режиме.Текстовую с вводом номера строки, которую надо реализовать
Как написать? с чего начать? Где можно почитать об этом?

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

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

Цитата Сообщение от young_snake Посмотреть сообщение
А если, скажем программа на виртуалке будет запущена, то id оборудования там будут одинаковые?
По обстоятельствам. В разных копиях одной и той же виртуальной машины (которые можно рассеять по любому количеству реальных машин) - да. В разных виртуальных машинах обычно идентификаторы разные (тот же Volume ID, к примеру, генерируется случайным образом во время форматирования диска).
2
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 263
13.07.2015, 18:20  [ТС] #3
Хорошо, а как примерно реализовать такой подход с ассиметричной криптографией? И как можно обойтись без него? Как в большинства программах, где ты берешь какой-нибудь код, который тебе выдает софт, и на основе его получаешь у автора серийник.
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.07.2015, 18:33 #4
Цитата Сообщение от young_snake Посмотреть сообщение
Хорошо, а как примерно реализовать такой подход с ассиметричной криптографией?
Взять хорошую проверенную криптографическую библиотеку и реализовать серверную и клиентскую части защиты.
Цитата Сообщение от young_snake Посмотреть сообщение
И как можно обойтись без него?
Можно упрощать приведённую мной схему. Заменить асимметричное шифрование симметричным. Заменить надёжное шифрование простым самопальным. Заменить криптографический хеш на что-то попроще из стандартных, сделать самопальный хеш, отказаться от хеширования вообще.
Каждый из этих шагов серьёзно упростит атакующему анализ защиты и создание генератора ключей.
В конечном итоге можно прийти к простейшей схеме вроде той, что десятилетиями использует Джефф Фогель: серийник вычисляется из VolumeID несколькими арифметическими операциями. То, что даже не генераторы, а просто формулы для генерации ключей, которые можно вбить в Excel и пользоваться, появляются в день выхода его продуктов, его не особо заботит: он полагается в основном на совесть пользователей (а в последнее время - на системы цифровой дистрибуции вроде Apple Store). Иными словами, он вкладывает в защиту ровно столько усилий, чтобы она считалась наличествующей с юридической точки зрения и ни капли больше (как я подозреваю, это несколько минут для каждой новой игры). И нельзя сказать, чтобы этот подход был лишён здравого смысла. Хоть он и не рассекает океаны на личной позолоченной яхте, с голоду не умер.
0
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 263
13.07.2015, 18:50  [ТС] #5
А если сделать генерацию ключа на основе имени/е-мейла? Тогда уже проблема с ИД тома не так страшна?
0
Kurles
158 / 123 / 30
Регистрация: 30.05.2015
Сообщений: 379
13.07.2015, 18:54 #6
Цитата Сообщение от young_snake Посмотреть сообщение
А если сделать генерацию ключа на основе имени/е-мейла? Тогда уже проблема с ИД тома не так страшна?
Тогда копию программы можно будет вообще на любой машине развернуть, имея ключ, сгенерированный на основе имени/е-мейла
0
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 263
13.07.2015, 18:56  [ТС] #7
Ну да, получается что так. А какие константы тогда использовать? ID процессора, например?
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.07.2015, 18:58 #8
Цитата Сообщение от young_snake Посмотреть сообщение
А если сделать генерацию ключа на основе имени/е-мейла? Тогда уже проблема с ИД тома не так страшна?
Не думаю, что эта проблема вообще страшна. Надо просто отдавать себе отчёт, что сама по себе такая схема защиты может быть и будет взломана, если сама программа хоть кому-то нужна. И неважно, к чему привязываемся.
Ну а генерация серийников на основе имени/почты - вполне популярная схема. Так же как и распространение серийных номеров в паре с именем/почтой. И как распространение кейгенов, вычисляющих серийник по этим данным.
0
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 263
13.07.2015, 19:09  [ТС] #9
Ну а примерная схема какова? Я беру HWID (например конкатенирую id винта и процессора - они хранятся как массив символов, я так понимаю?), потом например генерирую последовательность: складываю вместе код первого и третьего символа, второго и четвертого и так далее. В каждом случае на выходе получаю WORD( char + char то есть), потом, например, прохожусь по этим вордам и превращаю их побайтово в char, а если код выходит за границы ascii таблицы то как-то привожу его к коду в ее пределах. Я сам не совсем еще концепцию понял. В общем, вопрос в том, как из HWID сгенерировать цифро-буквенную последовательность серийника, а потом ее проверить. То есть пример алгоритма нужен.
0
Kurles
158 / 123 / 30
Регистрация: 30.05.2015
Сообщений: 379
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 - фиг.
0
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 263
13.07.2015, 20:16  [ТС] #11
Спасибо, наглядно, а без хеш-функций, исключительно манипулируя идентификаторами цпу и винчестера вручную?
0
Kurles
158 / 123 / 30
Регистрация: 30.05.2015
Сообщений: 379
13.07.2015, 21:35 #12
Цитата Сообщение от young_snake Посмотреть сообщение
Спасибо, наглядно, а без хеш-функций, исключительно манипулируя идентификаторами цпу и винчестера вручную?
По образу и подобию, свой вариант хеш-функции написать. Только есть ли смысл? Вот к примеру одна из
реализаций без использования сторонних библиотек.
0
young_snake
6 / 6 / 2
Регистрация: 26.12.2011
Сообщений: 263
14.07.2015, 15:17  [ТС] #13
Я не совсем это имел в виду. Я подразумевал какие-нибудь битовые операции, чтобы сначала получить HWID, который будет пользователю показан, и опять же какие-то операции над этим HWID чтобы сгенерировать и проверить серийник.
0
14.07.2015, 15:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2015, 15:17

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

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

Получение серийного номера материнской платы
насколько это надежно работает? будет ли он ТОЧНО получен или скажем так- ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru