入力したユーザー名とパスワードを確認/検証するだけの場合は、Rfc2898DerivedBytesクラス (Password Based Key Derivation Function 2 または PBKDF2 とも呼ばれます) を使用します。これは、RFC2898DerivedBytes の結果からパスワードに戻る実用的な方法がないため、Triple DES や AES などの暗号化を使用するよりも安全です。パスワードから結果にのみ進むことができます。パスワード文字列から暗号化キーと IV を導出するときに、パスワードの SHA1 ハッシュをソルトとして使用してもよいですか? を参照してください。.Net または String の例と説明については、パスワードを使用した暗号化/復号化 c# WinRT/Metro の 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[] を使用し、パスワードが不要になったらすぐに破棄またはゼロにすることを忘れないでください。