Ответ 1
Если вы просто проверяете/проверяете введенное имя пользователя и пароль, используйте класс Rfc2898DerivedBytes (также известный как деривация ключа на основе пароля Функция 2 или PBKDF2). Это более безопасно, чем использование шифрования, такого как Triple DES или AES, потому что нет никакого практического способа перейти от результата RFC2898DerivedBytes к паролю. Вы можете перейти только от пароля к результату. См. Можно ли использовать SHA1 хэш пароля в качестве соли при получении ключа шифрования и IV из строки пароля? для примера и обсуждения для .Net или Строка encrypt/decrypt с паролем С# Metro Style для WinRT/Metro.
Если вы сохраняете пароль для повторного использования, например, поставляя его третьему лицу, используйте API защиты данных Windows (DPAPI). Это использует сгенерированные и защищенные ключи операционной системы и алгоритм шифрования Triple DES для шифрования и дешифрования информации. Это означает, что вашему приложению не нужно беспокоиться о создании и защите ключей шифрования, что является серьезной проблемой при использовании криптографии.
В С# используйте класс 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 или байт [] вместо этого и не забудьте удалить или обнулить их, как только пароль больше не понадобится.