Безопасные данные в VB.NET? - PullRequest
2 голосов
/ 30 декабря 2011

В моем приложении VB.NET есть очень важная логическая переменная.Мне нужно иметь возможность сохранить его «где-то» и прочитать его в будущем (даже если приложение закрыто).

В настоящее время я храню переменную в виде файла .bin.Но я боюсь, что пользователь может просто взять файл и поработать над изменением значения.

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

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

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 30 декабря 2011

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

Типичные проблемы и решения

Как другие теоретически могут получить значение вашей переменной

  1. Декомпиляция вашей программы одним щелчком мыши с помощью .NET Reflector или любой другой программы .NET Decompilation.
  2. Анализировать память ПК во время работы программы и извлекать значение оттуда.
  3. Если ваше значение было сохранено в файле, пользователь может легко найти его, проанализировав активность ввода-вывода жесткого диска с помощью ловушки или сравнения дампа.
  4. Если ваше значение было сохранено в реестре, простой хук реестра или инструмент сравнения дампов реестра могут выяснить, где хранится значение.
  5. Если ваше значение зашифровано, метод № 1 (декомпиляция программы) может быть использован для выяснения того, как можно расшифровать.

Решение возможных проблем выше

  1. Можно использовать общую программу запутывания, чтобы усложнить декомпиляцию приложений. Для этого я предлагаю SmartAssembly . Кроме этого, есть инструмент под названием Spoon Studio (ранее назывался PostBuild), который перекомпилирует ваше приложение в код сборки (а также заставит его работать без установленного .NET Framework).
  2. Класс SecureString может быть использован для затруднения поиска и дешифрования значения, пока оно находится в памяти. Этот класс также очищает себя после использования, но обычно он немного медленнее, чем обычная строка.
  3. Хранение файлов в файле не является плохой идеей (даже если люди могут прослушивать файловую активность), поскольку вы всегда можете хранить переменную не очень приятным образом. Например, у вас может быть файл с именем IsFullScreen.bin, который содержит значение вашей логической переменной (1 или 0, или true или false), даже если он не имеет ничего общего с полноэкранным рендерингом. Это сделало бы это немного запутанным, но и не очень красивым в программировании.
  4. Для реестра все в решении # 3 все еще применяется.
  5. Шифрование также не является плохой идеей, и трудно дешифровать некоторые типы шифрования (например, шифрование с открытым / закрытым ключом, если у вас есть сервер) или хеширование (например, MD5 или SHA1).
  6. В вашем случае вы могли бы вместо этого сохранить значение на сервере?

Итак, подведем итог ...

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

Конечно, преждевременная безопасность - это плохо. Если это булево значение не ОЧЕНЬ важно, тогда, на мой взгляд, тоже подойдет простое шифрование.

Есть еще ...

Редактировать 1

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

Если это так, вы можете использовать шифрование на основе ключей, такое как шифрование XOR, а затем использовать MAC-адрес ПК или серийный номер материнской платы в качестве ключа для этого шифрования.

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

2 голосов
/ 30 декабря 2011

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

Затем вы можете прочитать значение из реестра и извлечь 0 или 1 из соответствующего местоположения.

1 голос
/ 30 декабря 2011

Зашифруйте значение перед его сохранением.Используйте .NET модель шифрования .Подробнее о том, как реализовать что-либо с использованием этой модели , см.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...