Защита программного обеспечения путем шифрования

Для нашего программного обеспечения мы используем аппаратные ключи для защиты программного обеспечения. Никакая защита не идеальна, но это коммерческое решение является доступным и честным честным человеком (как упоминалось в другом потоке). Преимуществом является 128-битный ключ, который хранится "нечитабельно" на аппаратном ключе.

Мы хотим удалить этот аппаратный ключ и начать использовать защиту программного обеспечения. В основном мы можем использовать коммерческий продукт, но, с другой стороны, это тоже не будет невозможно. Я не очень разбираюсь в шифровании и почему я публикую это. Как хранить ключ на компьютере под управлением Windows, который невозможно прочитать с помощью Reflector или что-то еще? Однако я должен иметь доступ к ключу для проверки кода лицензии.

Я просто хотел бы простое решение, которое невозможно взломать, просто используя Reflector.

Или я задаю очень глупый вопрос?


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

Спасибо большое!

Ответы

Ответ 1

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

Ответ 2

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

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

Итак, как мы лицензируем?

Мы генерируем случайный номер лицензии с каждой новой установкой (число от 10 до 99 тыс. отлично). Тогда у нас есть алгоритм для создания подходящего числа (что-то, что нетривиально будет делать). Кстати, мы используем случайное число, так что любая попытка переустановки на другом компьютере приводит к различным номерам лицензий/сопоставлений.

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

Я говорю, что общение с ними важно, потому что мы используем это как возможность поговорить с ними об их настройке, ответить на любые вопросы и сообщить им, что они имеют дело с настоящими людьми. Очень немногие люди нервничают, чтобы попытаться позвонить и выдать себя за другую компанию (мы просматриваем их и сравниваем их информацию с нашей базой данных). Обратите внимание, что наш пакет составляет около $2 тыс., Поэтому телефонные звонки являются разумными. Если ваш пакет стоит меньше и имеет более высокий объем, вы можете сделать это по электронной почте. Наконец, мы используем call-in, чтобы сообщить пользователям, как получить обновления и техническую поддержку с их новой лицензией.

Наконец, мы сохраняем ключ в базе данных приложения (локально установленную базу данных MSDE/SQL Express), чтобы любая попытка скопировать приложение A) была бы нетривиальной и B) приводила к большему количеству данных, специфичных для организация, которая сначала купила законную версию (что делает их менее вероятными). Лицензионный ключ шифруется и "разделяется" на два разных ключа, которые хранятся в двух разных таблицах. Таким образом, простой "найти ключ и ввести его в пиратскую версию" не будет работать.

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

Ответ 3

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

Чтобы проверить лицензию, отправка ключа в центральное место является самым безопасным способом, поскольку они должны взломать ваш сервер (или протокол, следить), чтобы иметь возможность проверить. Это потребует подключения для использования программного обеспечения, которое может быть или не быть осуществимым. Вы также можете распространять "сервер лицензий" вместе со своим программным обеспечением для больших установок, для которых требуется только доступ к локальной сети. Если вы не можете и не должны проверять только локально, вы можете написать dll в собственном коде, что затруднит реинжиниринг.

Чтобы защитить сам код и сделать его защиту труднее обходить, обфускать:

В целом, вы можете получить лучшее преимущество от упакованного решения.

Ответ 4

И вот почему Copy Protection и "честность честных пользователей" - это проигрышная битва. Вам не нужно держать честных пользователей честными, они уже есть.

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

Ответ 6

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

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

Ответ 7

Моя рекомендация, если она пригодна для жизни, придерживайтесь ключа. Они, как правило, являются наиболее жизнеспособными подходами.

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

  • Безопасное хранение ключа
  • Проверка лицензии
  • Обфускация времени компиляции (чтобы было труднее разобрать ваше приложение)

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

Ответ 8

Пока ничего не будет идеально, ознакомьтесь с API CryptProtectData, если вы хотите сделать это самостоятельно.

Если честно, у вас, вероятно, меньше головных болей, просто покупающих решение.

Ответ 9

Являются ли эти данные просто коммерческими вещами или вещами, которыми вы делитесь с рабочими, и поэтому форт?

Если это последний, возможно, вы можете написать краткую С++-программу для xor. В принципе, если длина ключа равна длине документа, она должна быть "нерушимой". То, что я делаю в С++, создает буфер случайных символов размера документа, затем xor, а затем просто отправьте документ и файл ключа отдельно, а затем другой человек соедините их вместе, чтобы вернуть документ.

Не знаю, поможет ли вам это.

Ответ 10

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

Почему бы не сохранить ключ или критическую часть кода защиты от копирования удаленно и, возможно, обработать его удаленно?

Ответ 11

Создайте хеш (SHA1, MD5 и т.д.) для ключа и жесткого кода хеша в вашем приложении. Распределите ключ для своих пользователей. В вашем исполняемом файле можно проверить хэш указанного пользователем ключа на жестком хеше:

bool CheckKey(string keyFromUser) 
   return SHA1(key) == "ABC2983CF293892CD298392FG";
}

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

Это, очевидно, не очень сильная защита.

Ответ 12

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

Ответ 13

Вы можете попробовать стандартные методы, обычно используемые в компьютерных играх, такие как: SafeDisc, StarForce, SecuROM или любой другой программное обеспечение для защиты от копирования. Эти системы входят в число наиболее развитых программных систем для защиты вашего приложения.

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

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

Ответ 14

Пожалуйста, позвольте мне добавить некоторые мысли к вашему вопросу:

  • Требуется ли вашему программному обеспечению какое-либо подключение к Интернету?
    • Если ответ "да", вы можете контролировать использование. (Расскажите клиенту об этой функциональности!)
    • Если ответ "нет", вы по-прежнему можете контролировать использование в большинстве случаев, но вы не можете принудительно установить соединение с серверами для работы продукта.
  • Вы хотите добавить защиту от копирования в свое программное обеспечение? Это не риторический вопрос, потому что
    • некоторое программное обеспечение должно быть настроено компанией программного обеспечения или ее партнерами. Если кто-то делает копию программного обеспечения, которое должно быть настроено экспертами, это просто не будет для него пользы.
    • например. если сотрудник вашего клиента хочет использовать ваше высококачественное программное обеспечение для проектирования схем для своих частных проектов дома, и вы даете ему разрешение на это, тогда у вас есть кто-то на вашем сайте клиентов, который будет голосовать за ваш продукт на каждом покупка решение.
    • усилия по защите рабочей копии могут быть выше, чем потери, создаваемые несанкционированными копиями. (Помните, вы можете включить его в следующую версию.)