.net — Безопасно ли хранить конфиденциальные данные в скомпилированном бинарном файле C ++?

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

Будет ли разумной альтернативой хранить конфиденциальные данные (например) в двоичных файлах C ++, которые могут быть использованы моим кодом .NET? Я пока ничего не знаю о взаимодействии, но мне любопытно, стоит ли искать такой путь. Я думаю, чтобы уточнить, мои вопросы:

  1. Может ли двоичный файл, созданный в C ++ (или C), быть легко декомпилирован для доступа к конфиденциальным строковым данным?
  2. Является ли эта идея совершенно бессмысленной, либо потому, что она не сработает, ее будет очень трудно реализовать, либо потому, что существует гораздо лучшая альтернатива, с которой я еще не сталкивался?

8

Решение

Ответ — нет. Несмотря на то, что это правда, .NET dll может быть тривиально декомпилирован в исходную структуру, а C / C ++ dll может быть декомпилирован только в беспорядок монстра, который понравился бы компилятору, данные, которые там хранятся, будут помещены в большой — разбито на части, так что любой, кто знал, на какую часть смотреть (и, конечно же, все эти данные, помещается близко друг к другу, поэтому становится трудно узнать, какой бит какой), но данные будут там, чтобы все могли их видеть.

Google для сегмент данных где находятся статические данные в двоичном файле Windows.

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

12

Другие решения

Строковые литералы можно читать из собственного (скомпилированного кода c ++) двоичного файла (exe или dll)

4

В вашем двоичном файле всегда есть способ узнать секретную информацию. Различия между двоичными файлами .NET и собственными двоичными файлами заключаются в сложности их обратного анализа (основная причина заключается в том, что код NET запускается на виртуальной машине процесса (ВМ), поэтому механизмы защиты .NET едва ли выполняют некоторые хитрости, помимо ВМ). Как вы упомянули, двоичные файлы .NET могут быть легко декомпилированы, даже если вы запутываете свой двоичный файл каким-то обфускатором, например, такими деобфускаторами, как de4dot может легко деобфусцировать. Но обратный анализ собственных двоичных файлов сложнее, чем первый. В этой области существует множество более эффективных механизмов защиты, таких как анти-отладка, обфускация виртуальной машины и так далее. Эти методы могут сделать ваш код более безопасным, конечно, это относительная вещь.

3

Ответ ДА. Чувствительные данные могут храниться в скомпилированных двоичных файлах C ++. Люди, которые ничего не знают о безопасности, делают это постоянно.

1

Существуют различные степени безопасности с различными затратами и неудобствами для пользователей. Хранение ключей в коде довольно распространено, но не очень безопасно. Поскольку вы используете .NET, что подразумевает Windows, и вы можете захотеть заглянуть в API защиты данных (DPAPI). Он шифрует данные, используя в качестве ключа пароль пользователя Windows.

Многие ноутбуки и серверы оснащены микросхемой Trusted Platform Module (TPM), которая выполняет шифрование для вас и защищает ключ для вас.

1