Вопрос по local, security, c# – Как надежно сохранить логин / пароль (локальный)?

91

Я делаю приложение для Windows, в которое нужно войти.
Данные учетной записи состоят из имени пользователя и пароля, и они должны быть сохранены локально.
Это просто вопрос безопасности, поэтому другие люди, использующие тот же компьютер, не могут видеть персональные данные каждого.
What is the best/most secure way to save this data?

I don't want to use a database, so I tried some things with Resource files.
But since I'm kind of new with this, I'm not entirely sure of what I'm doing and where I should be looking for a solution.

@Джон Сондерс: Хорошо, извините за мое невежество. Robin
Прежде всего, не сохраняйте пароль. Хэшируйте это (возможно, с помощью соли) и сохраняйте это вместо этого. carlosfigueira
любое окончательное решение с полным исходным кодом? Kiquenet
Я отредактировал ваш заголовок. Пожалуйста, смотрите & quot;Should questions include “tags” in their titles?"где консенсус" нет, они не должны ". John Saunders
& Quot; & Quot пользователей; Вы имеете в виду обычных пользователей Windows или что-то еще? (Я думаю, что вы имеете в виду некоторых из вас, имеющих «пользователей», поскольку обычный пользователь Windows уже не может видеть данные друг друга ...) Alexei Levenkov

Ваш Ответ

4   ответа
139

Если вы просто собираетесь проверить / подтвердить введенные имя пользователя и пароль, используйтеRfc2898DerivedBytes класс (также известный как функция получения ключа на основе пароля 2 или PBKDF2). Это более безопасно, чем использование шифрования, такого как Triple DES или AES, потому что нет практического пути перехода от результата RFC2898DerivedBytes к паролю. Вы можете перейти только от пароля к результату. УвидетьМожно ли использовать SHA1-хэш пароля в качестве соли при получении ключа шифрования и IV из строки пароля? для примера и обсуждения для .Net илиСтрока шифрования / дешифрования с помощью пароля c # Metro Style для WinRT / Metro.

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

В C # используйтеSystem.Security.Cryptography.ProtectedData учебный класс. Например, чтобы зашифровать часть данных, используйтеProtectedData.Protect():

// Data to protect. Convert a string to a byte[] using Encoding.UTF8.GetBytes().
byte[] plaintext; 

// Generate additional entropy (will be used as the Initialization vector)
byte[] entropy = new byte[20];
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
    rng.GetBytes(entropy);
}

byte[] ciphertext = ProtectedData.Protect(plaintext, entropy,
    DataProtectionScope.CurrentUser);

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

byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
    DataProtectionScope.CurrentUser);

Обратите внимание, что существуют дополнительные соображения безопасности. Например, избегайте хранения таких секретов, как пароли, какstring, Строки являются неизменяемыми, поскольку они не могут быть уведомлены в памяти, так что кто-то, просматривающий память приложения или дамп памяти, может увидеть пароль. использованиеSecureString или байт [] вместо этого и не забудьте удалить или обнулить их, как только пароль больше не нужен.

Кажется, что класс теперь известен как Rfc2898DeriveBytes (маленькие буквы, .net 4.5 и 4.6) и может быть найден здесь: Пространство имен: System.Security.Cryptography Сборка: mscorlib (в mscorlib.dll)
Большое спасибо. Сначала я использовал md5 для хэширования, но я скептически относился к этому. Это кажется более безопасным. Еще один вопрос, хотя. Я хочу сохранить несколько таких данных в текстовом файле. Я вижу, что когда я открываю свой файл, это просто набор случайных символов, но достаточно ли это безопасно для этого? Или вы рекомендуете другой способ хранения данных? Robin
@CrispyGMR Я исправил этот фрагмент кода в ответе. Хороший улов.
Привет, я попробовал это, но я получил ошибку в entropy = rng.GetBytes (20), говорящую: не могу преобразовать из int в байт [] Robin
Очень информативно, однако я думаю, что весь смысл использованияProtectedData так что мне не нужно беспокоиться оStore the entropy and ciphertext securely, ... so only the current user can read it, Я думаю, что это предлагает простоту в том, что я могу хранить их, однако это удобно, и все же только CurrentUser может расшифровать его.entropy Параметр также является необязательным и выглядит аналогично IV, где уникальность важнее, чем секретность. Таким образом, значение может быть пропущено или жестко закодировано в программе в ситуациях, когда изменение и обновление открытого текста нечасто.
4

поэтому, если вы планируете использовать кроссплатформенное ядро dotnet, вам придется искать в другом месте. Увидетьhttps://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.md

3

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

8

Я использовал это раньше, и думаю, чтобы убедиться, что учетные данные сохраняются и самым безопасным способом

  1. you can write them to the app config file using the ConfigurationManager class
  2. securing the password using the SecureString class
  3. then encrypting it using tools in the Cryptography namespace.

Надеюсь, эта ссылка очень поможет:кликните сюда

Похожие вопросы