Как безопасно хранить ключ шифрования в сборке.NET
Чтобы никто не мог легко получить мои данные, я кеширую данные из своего сервиса в виде зашифрованных файлов (в основном, защита от копирования).
Однако для этого я должен сохранить ключ шифрования в сборке.NET, чтобы он мог шифровать и дешифровать эти файлы.
Зная о таких инструментах, как.NET Reflector от Red Gate, которые могут вытащить мой ключ, я чувствую, что это не очень безопасный способ сделать это... есть ли лучшие практики для этого?
3 ответа
Вы должны решить, что является приемлемым уровнем риска. Не существует "безопасного" способа сделать это.
Если риск того, что кто-то использует отражатель или просто откроет сборку с помощью класса System.Reflection.Assembly и перехватит ресурс таким образом, слишком велик, то следующим шагом, вероятно, будет загрузка ключа с сервера при запуске.,
Тогда кто-то должен будет сделать что-то вроде отладки при использовании вашего кода и таким образом получить ключ. Вы можете отменить срок хранения кэшированных данных и поменять ключи. Вы можете сделать так, чтобы у каждого человека были свои ключи для защиты данных одного пользователя от другого.
Вы можете делать много всего, но если ваша цель - не дать кому-то дешифровать информацию о том, что сборка, которую вы помещаете на свою машину, может расшифровать, вы должны знать, что это практически невозможно. Все, что вы действительно можете сделать, это повысить стоимость пиратства ваших ключей / данных; ты не можешь это остановить.
Как подсказывает Макс, вы должны рассмотреть модель угрозы.
О каких нападающих вы беспокоитесь? (Законно быть обеспокоенным о некоторых, и не настолько законно, чтобы беспокоиться о других). Типичными категориями могут быть "неопытный пользователь, купивший программу", "преданный человек, готовый часами искать решение", "случайный пользователь, который знает, как найти трещины в сети" и т. Д.
В зависимости от вашего точного сценария, решения могут быть разными.
Следует отметить один интересный / печальный момент: если ваш продукт популярен, то потребуется всего один или два преданных своему делу человека, чтобы сесть и сломать его, а затем выпустить патч для всех. Я полагаю, что это природа программного обеспечения, и это нерешенная проблема, когда все ваше приложение работает на их компьютере.
Ясно, что это означает, что ваше приложение не работает как веб-сайт, то есть оно не находится под вашим контролем.
Я знаю, что это не особенно полезный ответ.
Вы не можете предотвратить расшифровку, но вы можете предотвратить повторное шифрование фальсифицированных данных:
Пока ваш код работает на компьютере, доступном для других, вы не сможете помешать им изучить программу. Однако декомпиляция и анализ действительно стоят времени. Как указывает MaxGuernseyIII, все дело в приемлемых уровнях угрозы.
В вашем случае проблема не в том, что хакер может декомпилировать ваш код, а в том, что он может изменить данные, которые вы хотите защитить (кому принадлежит лицензия).
Таким образом, вы можете использовать метод шифрования с открытым ключом для шифрования данных. Таким образом, хакер может читать, но он не может повторно зашифровать.