Я делаю приложение для Windows, в которое нужно сначала войти.
Детали учетной записи состоят из имени пользователя и пароля, и их необходимо сохранить локально.
Это просто вопрос безопасности, поэтому другие люди, использующие тот же компьютер, не могут видеть личные данные всех.
Каков самый лучший / самый безопасный способ сохранить эти данные?
Я не хочу использовать базу данных, поэтому попробовал кое-что с файлами ресурсов.
Но поскольку я новичок в этом, я не совсем уверен в том, что делаю и где мне следует искать решение.
Ответы:
Если вы просто собираетесь проверить / подтвердить введенное имя пользователя и пароль, используйте класс Rfc2898DerivedBytes (также известный как функция вывода ключа на основе пароля 2 или PBKDF2). Это более безопасно, чем использование шифрования, такого как Triple DES или AES, потому что нет практического способа вернуться от результата RFC2898DerivedBytes к паролю. Вы можете только перейти от пароля к результату. См. Можно ли использовать хэш пароля SHA1 в качестве соли при получении ключа шифрования и IV из строки пароля? для примера и обсуждения .Net или String для шифрования / дешифрования с паролем c # Metro Style для WinRT / Metro.
Если вы храните пароль для повторного использования, например, для передачи его третьему лицу, используйте Windows Data Protection API (DPAPI) . При этом используются сгенерированные и защищенные ключи операционной системы и алгоритм шифрования Triple DES для шифрования и дешифрования информации. Это означает, что вашему приложению не нужно беспокоиться о создании и защите ключей шифрования, что является серьезной проблемой при использовании криптографии.
В C # используйте класс System.Security.Cryptography.ProtectedData . Например, чтобы зашифровать часть данных, используйте
ProtectedData.Protect()
:Надежно храните энтропию и зашифрованный текст, например, в файле или разделе реестра с установленными разрешениями, чтобы только текущий пользователь мог их прочитать. Чтобы получить доступ к исходным данным, используйте
ProtectedData.Unprotect()
:Обратите внимание, что есть дополнительные соображения безопасности. Например, избегайте хранения секретов, таких как пароли, в виде файла
string
. Строки неизменяемы, так как они не могут быть уведомлены в памяти, поэтому кто-то, просматривающий память приложения или дамп памяти, может увидеть пароль. Вместо этого используйте SecureString или byte [] и не забудьте удалить или обнулить их, как только пароль больше не понадобится.источник
ProtectedData
заключается в том, что мне не нужно беспокоиться о безопасном хранении энтропии и зашифрованного текста, ... поэтому только текущий пользователь может его прочитать . Я думаю, что он предлагает простоту в том, что я могу хранить их, но это удобно, и по-прежнему только CurrentUser может его расшифровать.entropy
Параметр также является необязательным , и появляется похожий на IV , где уникальность имеет значение больше , чем секретность. Таким образом, значение, вероятно, может быть опущено или жестко закодировано в программе в ситуациях, когда изменение и обновление открытого текста происходит нечасто.Я использовал это раньше, и я думаю, чтобы убедиться, что учетные данные сохраняются и наиболее безопасным способом
ConfigurationManager
классSecureString
классаCryptography
пространстве имен.Я надеюсь, эта ссылка будет очень полезной: Нажмите здесь
источник
DPAPI как раз для этого. Используйте DPAPI для шифрования пароля при первом вводе пароля, сохраните его в безопасном месте (реестр пользователя, каталог данных приложения пользователя - некоторые варианты). Всякий раз, когда приложение запускается, проверяйте местоположение, чтобы узнать, существует ли ваш ключ, использует ли оно DPAPI для его расшифровки и разрешения доступа, в противном случае - запретите его.
источник
Это работает только в Windows, поэтому, если вы планируете использовать кросс-платформенное ядро dotnet, вам придется поискать в другом месте. См. Https://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.md
источник
Я хотел зашифровать и расшифровать строку как читаемую.
Вот очень простой быстрый пример в C # Visual Studio 2019 WinForms на основе ответа от
@Pradip
.Правильный проект нажмите> Свойства> Настройка> Создать
username
иpassword
настройку.Теперь вы можете использовать только что созданные настройки. Здесь я сохраняю
username
и,password
но шифрую толькоpassword
поле значимого значения вuser.config
файле.Пример зашифрованной строки в
user.config
файле.Полный код
источник