Есть ли какое-то безопасное локальное хранилище в Windows? - PullRequest
18 голосов
/ 14 января 2009

Я думал о создании небольшого инструмента. Не важно, что будет делать инструмент. Важным моментом является то, что инструмент должен будет хранить некоторую конфиденциальную информацию на жестком диске пользователя. РЕДАКТИРОВАТЬ: информация, которая будет храниться, является информацией пользователя - я не пытаюсь защитить свой собственный контент, который я распространяю с приложением. Я понимаю, что мне нужно зашифровать эту информацию. Но тогда, где я могу безопасно хранить пароль шифрования? Это какая-то бесконечная рекурсия ...

Итак, есть ли способ, чтобы зашифровать информацию в Windows и обеспечить безопасное управление паролями в Windows? Когда я говорю «Windows», я имею в виду Windows XP SP2 или более позднюю версию.

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

Я ищу как .NET 2.0 (C #), так и собственные (C / C ++) решения этой проблемы.

Ответы [ 7 ]

22 голосов
/ 14 января 2009

есть ли способ зашифровать информацию в windows и обеспечить безопасное управление паролями в Windows?

CryptProtectData: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx

Использование из .NET: http://msdn.microsoft.com/en-us/library/aa302402.aspx

Исторически, защищенное хранилище (доступно в XP, доступно только для чтения в Vista +): http://msdn.microsoft.com/en-us/library/bb432403%28VS.85%29.aspx

5 голосов
/ 14 января 2009

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

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

3 голосов
/ 14 января 2009

Вы можете использовать собственное средство шифрования. Установите атрибут encrypt для своей папки или файла (на странице свойств нажмите кнопку «Дополнительно»). Затем вы можете указать пользователей, которые могут получить доступ к файлу (по умолчанию сюда входит только создатель файла). Большим преимуществом этого решения является то, что оно полностью прозрачно с точки зрения приложения и пользователей.

Чтобы сделать это программно: используя Win32 API, вызовите EncryptFile() в каталоге, где вы хотите хранить свои конфиденциальные данные для каждого пользователя. Отныне все вновь созданные файлы в этом каталоге будут зашифрованы и доступны для чтения только их создателю (это будет текущий пользователь вашего приложения). В качестве альтернативы вы можете использовать флаг FILE_ATTRIBUTE_ENCRYPTED для отдельных файлов во время создания. Вы можете проверить информацию о шифровании в проводнике на странице свойств файла и убедиться, что созданные приложением файлы правильно зашифрованы и доступны только для соответствующих пользователей. Нет пароля для хранения или использования, все прозрачно.

Если вы хотите скрыть данные от всех пользователей, вы можете создать специального пользователя для конкретного приложения и олицетворять его из своего приложения. Это, наряду с ACL, является благословенной техникой для Windows для системных служб.

2 голосов
/ 14 января 2009

Возможно, вы захотите взглянуть на изолированное хранилище, которое является способом автоматического сохранения настроек и других данных в данных для каждого приложения. См. пример и MSDN .

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

Edit:

Из памяти, когда я в последний раз использовал это, хороший подход - написать класс «Setting», который обрабатывает все настройки и т. Д. В вашем приложении. Этот класс затем имеет эквивалент методов Serialize и DeSerialize, которые позволяют ему записывать все свои данные в файл IsolatedStorage или загружать их снова.

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

0 голосов
/ 14 января 2009

Хм, что вы пытаетесь достичь, это именно то, что DRM пытался достичь. Зашифруйте что-то, затем дайте пользователю ключи (как бы не были запутаны) и шифрование. Они сделали это с DVD. Они сделали это с Blu-Ray. Они сделали это с iTunes.

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

Если все, что вы делаете, это зашифровывает данные пользователя, то спросите у пользователя его пароль. Если вы пытаетесь защитить свои внутренние данные от пользователя, запустившего приложение, вы - S.O.L.

0 голосов
/ 14 января 2009

Я рекомендую вам взглянуть на блок приложения криптографии для Enterprise Library. Проверьте это сообщение в блоге . В Windows есть встроенный API защиты данных для шифрования данных, но блок приложений Crypto делает его более простым.

0 голосов
/ 14 января 2009

Эмм хеш пароль? Вам не нужно хранить реальную сделку где-либо на машине, только хешированный пароль (возможно, тоже соленый). Затем, когда пользователь вводит свой пароль, вы выполняете ту же самую операцию над ним и сравниваете его с хешированным, который вы сохранили на диске.

...