Алгоритм серийного номера (регистрационного ключа) в .NET [закрыто]

StackOverflow https://stackoverflow.com/questions/453908

Вопрос

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

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

Итак, каковы варианты генерации (и проверки) ключа?Аппаратный ключ, скорее всего, отсутствует, поскольку модель установки предполагает запуск из общего ресурса Samba на сервере интрасети.И какой длины должен быть ключ?

Во-вторых, насколько велика опасность того, что алгоритм проверки просто отразится, даже если он запутан?Не лучше ли вместо этого написать алгоритм в неуправляемом коде?

Это было полезно?

Решение

По моему мнению, ключевая проблема, с которой вы столкнетесь, связана не с вашим алгоритмом регистрации, а с уровнем (или отсутствием) запутывания.

Скорее, это так: в какой-то момент в вашем коде все сводится к простому двоичному решению - запустить или выйти. Для взлома вашей системы требуется только найти и настроить эту точку принятия решения.

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

Другие советы

Обычно вам нужно выбрать некоторые данные, которые вы хотите включить в ключ, например, кто им владеет и когда истечет срок его действия, возможно, даже некоторые небольшие фрагменты кода, которые необходимы вашему приложению для правильной работы (что затрудняет его работу без ключ).Затем используйте схему цифровой подписи, например RSA, для цифровой подписи ключа с помощью закрытого ключа вашей компании.Распространите открытый ключ вместе с исполняемым файлом приложения.Затем, когда вы загрузите ключ, просто убедитесь, что подпись действительна, а затем используйте данные, содержащиеся в ключе.Для этого достаточно ключа длиной 1024 или 2048 бит.

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

Что касается рефакторинга ключа, то его запись в неуправляемом может не помочь, если они убьют сайт вызова с управляемого на неуправляемый. Если вы используете Dotfuscator professional, у вас есть один вариант с запутыванием - включить их & Quot; Tamper Detection & Quot; по сути, они помечают вашу сборку, и если кто-то изменяет, вы можете сделать так, чтобы ваш код делал разные вещи. Конечно, хакер может удалить это, но это намного больше пота и слез.

Я нашел только один способ очень хорошо заблокировать код. Среднестатистический программист второго курса может легко взломать практически любую форму последовательной проверки.

Я сделал это, используя объект License в .NET. В моем собственном объекте лицензии он читает & Quot; license & Quot; файл, чтобы узнать, где " home " является. Эта лицензия является зашифрованной строкой. Закрытый ключ к строке находится в объекте License.

Затем объект License вызывает дом с секретным паролем, также зашифрованным. Сервер расшифровывает пароль и проверяет его ... также регистрирует IP-адрес и имя пользователя в случае расследования мошенничества. Если сервер может подтвердить пароль, он отвечает секретным ответом, зашифрованным снова, чтобы его нельзя было подделать. Если это невозможно проверить, соединение сбрасывается. Ответ не отправляется, поэтому объект License на другом конце завершается ошибкой.

При сбое интегрированного объекта License он автоматически генерирует исключение, заставляя приложение завершиться с ошибкой и завершиться в момент вызова лицензии.

Мне потребовалось около двух рабочих дней, чтобы написать сервер и объект License, так что это немного тренировка, но не ракетостроение.

Если вам нужен пример источника или дополнительная информация, дайте мне знать. Я буду рад получить от вас то, что я могу.

Возможно, вы захотите взглянуть на ответы на этот вопрос

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top