Если вы просто собираетесь проверить / подтвердить введенное имя пользователя и пароль, используйте класс 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()
:
// 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 или byte [] и не забудьте удалить или обнулить их, как только пароль больше не понадобится.