Якщо ви просто збираєтесь перевірити / підтвердити введене ім'я користувача та пароль, використовуйте клас Rfc2898DerivedBytes (також відомий як Функція виведення ключа на основі пароля 2 або PBKDF2). Це більш безпечно, ніж використання шифрування типу Triple DES або AES, оскільки немає жодного практичного способу повернутися від результату RFC2898DerivedBytes до пароля. Ви можете перейти лише від пароля до результату. Див. Чи нормально використовувати хеш пароля SHA1 як сіль для отримання ключа шифрування та IV із рядка пароля? для прикладу та обговорення для .Net або String шифрування / дешифрування паролем c # Стиль метро для WinRT / Metro.
Якщо ви зберігаєте пароль для повторного використання, наприклад, надання ним третьої сторони, використовуйте API захисту даних Windows (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 або байт [] і пам’ятайте, що розпоряджатись або нулювати їх, як тільки пароль більше не знадобиться.