Как создать регистрационные ключи для программ, высылаемых разным людям по интернет?
Перво-наперво, я хотел узнать, насколько это вообще реально и какие средства для этого нужны. Подскажите?
Если кто-то не понял, чего я хочу, то объясню на примере: в лицензионных играх перед первым запуском нужно ввести лицензионный ключ, иначе игра не запустится. Мне нужен такой же механизм, пусть и совсем простенький, хоть самый незамысловатый. Как это реализовать?:)
1) Можно регистрироваться через инет.
Человек вводит ключ, программа обращается к удаленному серверу, на котором ключ проверяется, отсылает ответ клиенту, и на основании этого ответа, программа решает, переключиться на полную версию или нет. Тогда надо, высылать по почте автору ключ, например. Сложности - обеспечить шифрование на передаче запроса серверу, и главное - на передаче сервером подтверждения/отрицания корректности ключа.
2) Можно жестко зашить в прогу список сгенеренных ключей (скажем, 100 000 разных, 256 - битных), и потом вести учет свободных/занятых/скомпрометированных ключей, которые ты высылаешь пользователю. Сложность - как их хранить, чтоб нельзя было выдрать из бинарника.
3) http://forum.codenet.ru/showthread.php?t=35581 - вот тут похожие вопросы обсуждались. Если полностью рассказывать про них, долго. Спрашивай конкретней:) В общем про регкоды посмотри прилепленные ссылки в разделе КБ. Например, Склярова, а лучше - в Google:).
[color=green] Может быть, перенести тему в Компьютерная Безопасность?[/color]
P.S. По сути мне надо, чтобы человек, получивший файл, не мог отправить его другому человеку на пользование. Быть может, кто-нибудь порекомендует наиболее простой вариант решения этой задачи?
Вот сгенерировал я ключик, а как заставить программу проверять, подходит ли этот ключик? С чего конкретно надо начать?
Где он должен находиться - это не принципиально для построения защиты, но можно считать (как делается в большинстве подобных программ), что он удален. Необходимо организивать доступ к нему по защищенному протоколу - но это уже технические подробности.
P.S. По сути мне надо, чтобы человек, получивший файл, не мог отправить его другому человеку на пользование. Быть может, кто-нибудь порекомендует наиболее простой вариант решения этой задачи?
Файл - никак. Файл - это просто набор байтов.
Ты можешь его послать кому-то его в зашифрованном виде, но если получатель имеет возможность его расшифровать - ты никак технически не запретишь ему его распространять в расшифрованном виде. Можно установить на файл какие-то юридические права - и тогда распространение копий будет преследоваться.
Вот сгенерировал я ключик, а как заставить программу проверять, подходит ли этот ключик? С чего конкретно надо начать?
Какой конкретно ключ? Поясни. В примитивном случае - можно хранить в программе некоторые массивы структур типа
{
char hash[length]; // Хэш ключа.
enumState state; /* Описание его состояние - свободен, занят, скомпрометирован.*/
}
И при попытке вставить ключ - вычислить от него хэш, и проверить, совпадает ли он с каким либо. Далее, смотря по состоянию - либо регистрируем программу, либо сообщеем, что такой ключ уже кем то используется, либо (в худшем случае:)) сообщаем о попытке взлома куда следует;).
А вот еще насчет приведенного кода: в какой среде этот код писать? В той же, в которой написана и программа?
А что такое хэш ключа? Откуда он берется?
Ключ регистрации (не принципиально, что именно он из себя представляет).
- А какие способы бывают? Желательно какие-нибудь легкореализуемые))
Легче всего - распространять под GPL:) Про способы защиты программ от копирования - посмотри прилепленные ссылки раздела "Компьютерная безопасность", и несколько тем там были, могут быть полезны. И потом уже задавай конкретные вопросы. А так же определись, что тебе все таки нужно - шифровать файлы, или реализовать регистрацию программ?
А вот еще насчет приведенного кода: в какой среде этот код писать? В той же, в которой написана и программа?
Ты имеешь в виду IDE? Неважно, я показал пример, как может храниться информация о ключах. Ее можно хранить на удаленном сервере - тогда, пользователь получил ключ (некоторый файл) - например, зашифрованной почтой. Он в программе на своей стороне выбирает - установить ключ. И тогда программа по защищенному протоколу лезет на заданный тобой сервер, где хранится база ключей, и проверяет - каков статус этого ключа. А показанная структура - такой может быть, например, структура записи БД на сервере, где хранится информация о ключах.
А что такое хэш ключа? Откуда он берется?
Вычисляется спец. хэш - функцией. Советую спрева почитать FAQ по криптографии в разделе КБ.
2) Хэш ключа и код регистрации - одно и то же?
3) Как здесь в сообщениях делать цитаты? Я понял, как цитировать весь ответ, а как цитировать произвольно выбранную его часть?
Перечитай посты выше, там тебе указали несколько способов.
2) Хэш ключа и код регистрации - одно и то же?
Ты игнорировал мой совет почитать фак по криптографии:). Поясню терминологию (в некоторых местах может упрощу). В общем случае - есть подтвержденное и заверенное (скажем, купленное, полученное по наследству или выигранное в лотерею) право пользователя юзать полнофункциональную версию программы. Как это право воплотить и защитить от посягательств? Берем некоторые данные, которые злоумышленнику будет трудно подобрать - это назовем ключ активации, регистрационный код и.т.д. Пользователь получает его в виду ценного письма, на мыло, или еще как то. Далее - установленная программа должна как то проверить, что те данные, которые ввел пользователь, пытаясь зарегаться - корректны, т.е. -
1) Данный ключ является правильным (официальным, оплаченным) ключом.
2)Данный ключ не был до этого кем-то использован.
Теперь как это реализовать. Программа принимает введенный пользовтелем ключ, и отсылает его по защищенному протоколу на сервер регистрации. На СР хранится централизованная, управляемая издателями программы БД. В ней хранятся хэши существующих ключей, и для каждого ключа есть статус - свободен ключ (ввод такого ключа означает успешную регистрацию), или занят .
Для этого мы при при проверке ключа считаем его хэш и смотрим, есть ли такой в БД, и если есть - то каков его статус. Далее по обстоятельствам.
Как понятней-то объяснить?
А база с хэшами ключей и их статусами может храниься на жестком диске моего компьютера? А в интернет-системах для хранения информации (например, ifolder)?
Говорю, читай faq в разделе КБ! там есть ссылки по SSL, SSH и другие.
А база с хэшами ключей и их статусами может храниься на жестком диске моего компьютера? А в интернет-системах для хранения информации (например, ifolder)?
На сервере с строго ограниченном доступом. Но это лучше вопрос в разделе по БД задавай.
Надёжный вариант - собрать ID оборудования при установке (например, MAC-адрес сетевой карты), по этим данным сгенерировать на сервере файл лицензии, прислать его пользователю.
А что, если пользователь например, поставил прогу, она считала оборудование, отослала на сервер ,тот сгенерил лицензию. Пользователь ее получил, поставил и счастлив. А потом он поменял железо. И что тогда?..;)
Стойкость защиты определяется самым слабым звеном (прошу прощения за штамп...):). Ты предлагаешь вначале делать жесткую привязку к железу - а потом, когда оно смениться, в качестве реаниматора использовать мыло?:D
Имхо, жесткую привязку к оборудованию надо использовать, когда оно является неотъемлемой частью программы. Скажем, как StarForce на CD.
Собственно это обравданно при наличии скажем какихнибудь железячных (USB например) ключей )
Это не освобождает тебя от ответственности!:cool:
Собственно это обравданно при наличии скажем какихнибудь железячных (USB например) ключей )
Ну так и я про это говорю. Но имхо - если есть возможность обойтись без них, то надо попробовать. А про способы защиты много тут писали, советую просмотреть...
ИМХО, если не заключать фрагменты кода в железное устройство (ПЗУ, например), такая защита будет сломана.
Посмотри ссылку на обсуждение, которую я давал. Во-первых, аппаратные ключи будут стоить денег. Во вторых - они усложнят работу всего сервиса.
А нужен компромисс между защищенностью и удобством пользователей. Если будет найдена уязвимость -то можно на несколько дней закрыть сервис, перепроверить БД игры, и выпустить обновленых клиентов. НО - если все будет сденано неудобно, громоздко и дорого - никто просто не станет играть...:(
P.S. По сути мне надо, чтобы человек, получивший файл, не мог отправить его другому человеку на пользование. Быть может, кто-нибудь порекомендует наиболее простой вариант решения этой задачи?
добавь функцию проверки "mac-адрес компьютера". и программа будет работать только в этом компьютере