Как безопасно сохранять имя пользователя / пароль (локально)?

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

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

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

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

    В C # используйте class 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 или байт [] и не забудьте удалить или обнулить их, как только пароль больше не понадобится.

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

    1. вы можете записать их в файл конфигурации приложения, используя class ConfigurationManager
    2. защита пароля с помощью classа SecureString
    3. затем шифруя его с помощью инструментов в пространстве имен Cryptography .

    Эта ссылка будет очень полезной. Надеюсь: Нажмите здесь.

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

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

    Давайте будем гением компьютера.