Как все говорили, волшебной пули нет. Пользователь может выключить компьютер, подключить HD-диск в качестве ведомого устройства к другому компьютеру, создать резервную копию всего, выполнить обратный анализ кода и успешно его взломать. Если у пользователя есть физический доступ к исполняемому файлу, он может быть скомпрометирован, и в 100% случаев ничего не останется, чтобы остановить его.
Лучшее, что вы можете сделать, - это сделать работу потенциального взломщика чертовски трудной, но независимо от того, что вы делаете, она не будет нерушимой.
Использование самоуничтожения в случае чего-то неправильного может быть обойдено взломщиком, который сделает резервную копию всего.
Использование ключа в драйвере USB помогает усложнить жизнь взломщику, но может быть окончательно побеждено компетентным решительным взломщиком: код, который не может расшифровать данные, не может быть в зашифрованном состоянии (включая часть, которая получает ключ) ), так что это большая слабость. Взлом этой части кода для сохранения ключа в другом месте приводит к его потере.
Если программное обеспечение выполняет аутентификацию на удаленном сервере, это можно сделать, атаковав клиент и обходя аутентификацию. Если он получает ключ от сервера, можно использовать анализ сети, чтобы перехватить данные сервера, которые содержат ключ. Если данные сервера зашифрованы, взломщик может дешифровать их, проанализировав программное обеспечение, которое их расшифровывает, и обнаружив незашифрованные данные.
В частности, взломщику было бы намного проще, если бы он использовал эмулятор для запуска вашего программного обеспечения, способного сохранять снимки памяти (включая незашифрованную версию алгоритма). Еще проще, если он может манипулировать и закреплять память напрямую во время работы вашего программного обеспечения.
Если вы не ожидаете, что ваш ненадежный клиент очень решителен, вы можете просто усложнить ситуацию и надеяться, что он никогда не получит достаточно энергии и умения, чтобы стоить того, чтобы его сломать.
Лучшее решение, на мой взгляд, состоит в том, чтобы получить все программное обеспечение на вашем доверенном сервере, и заставить их сервер просто попросить ваш сервер выполнить работу и сохранить ваши алгоритмы на вашем сервере. Это гораздо безопаснее и проще, чем все остальное, поскольку устраняет фундаментальную проблему: пользователь больше не имеет физического доступа к алгоритму. Вы должны действительно подумать о том, как сделать это, исключив необходимость хранить код в клиенте. Однако даже если это не является неразрушимым, хакер может определить, что делает алгоритм, анализируя выходной сигнал в зависимости от входных данных. В большинстве сценариев (не похоже, что это ваш случай) алгоритм не является самым важным в системе, но вместо этого данные.
Итак, если вы действительно не можете избежать запуска алгоритма на ненадежной стороне, вы не можете сделать гораздо больше, чем вы уже сказали: зашифровать все (преимущественно на оборудовании), аутентифицировать и проверить все, уничтожить важные перед тем, как кто-то подумает о резервном копировании, если вы подозреваете, что что-то не так, и кому-то это чертовски сложно.
НО, ЕСЛИ ВЫ ДЕЙСТВИТЕЛЬНО ХОТИТЕ НЕКОТОРЫХ ИДЕЙ, И ДЕЙСТВИТЕЛЬНО ХОТИТЕ ДЕЛАТЬ, ЗДЕСЬ МЫ ИДЕМ:
Я мог бы предложить вам сделать вашу программу мутантом. И.Е .: Когда вы расшифровываете свой код, зашифруйте его другим ключом и выбросьте старый ключ. Получите новый ключ от сервера и подтвердите, что ключ сам по себе закодирован таким образом, что было бы очень трудно издеваться над сервером чем-то, что дает скомпрометированные новые ключи. Сделайте некоторую гарантию того, что ключ уникален и никогда не используется повторно. Опять же, это не является неразрушимым (и первое, что может сделать взломщик, это атаковать эту самую функцию).
Еще одна вещь: добавьте много неочевидных красных линий, которые выполняют странные проверки непонятной непротиворечивости, которые содержат множество нефункциональных поддельных версий вашего алгоритма, и добавьте множество сложных оверблотов, которые фактически ничего не делают и утверждают что он работает так, как ожидалось от реального кода. Заставьте настоящий код делать то, что выглядит странно и бессмысленно. Это делает отладку и реверс-инжиниринг еще сложнее, потому что взломщику потребуется много усилий, пытаясь отделить то, что полезно от мусора.
РЕДАКТИРОВАТЬ: И, очевидно, сделать часть ненужного кода выглядящей лучше, чем правильную, чтобы взломщик выглядел там в первую очередь, эффективно теряя время и терпение. Излишне говорить, что все запутывают, поэтому, даже если взломщик получит простой незашифрованный исполняемый код, он все равно выглядит запутанным и очень странным.