私は Windows アプリケーションを作成していますが、最初にログインする必要があります。
アカウントの詳細はユーザー名とパスワードで構成されており、ローカルに保存する必要があります。
これはセキュリティの問題であり、同じコンピューターを使用している他の人が全員の個人データを見ることができないようにするためです。
このデータを保存する最良/最も安全な方法は何ですか?
データベースは使いたくないので、リソース ファイルでいくつか試してみました。
しかし、この分野は初心者なので、何をやっているのか、どこに解決策を探せばいいのかがよくわかりません。
ベストアンサー1
入力したユーザー名とパスワードを検証/検証するだけの場合は、Rfc2898派生バイトクラス(パスワードベースのキー導出関数2またはPBKDF2とも呼ばれます)。これは、RFC2898DerivedBytesの結果からパスワードに戻る実用的な方法がないため、トリプルDESやAESなどの暗号化を使用するよりも安全です。パスワードから結果に戻ることしかできません。パスワード文字列から暗号化キーと IV を導出するときに、パスワードの SHA1 ハッシュをソルトとして使用しても問題ありませんか?.Netの例と議論については、パスワードによる文字列の暗号化/復号化 c# Metro スタイルWinRT/Metro 用。
パスワードを第三者に提供するなど再利用のために保存する場合は、Windows データ保護 API (DPAPI)オペレーティングシステムが生成し保護したキーとトリプルDES情報を暗号化および復号化する暗号化アルゴリズム。つまり、暗号化を使用する際に大きな懸念となる暗号化キーの生成と保護についてアプリケーションで心配する必要がありません。
C#では、システム.セキュリティ.暗号化.保護されたデータクラス。例えば、データを暗号化するには、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
。文字列は不変であり、メモリ内で通知できないため、アプリケーションのメモリやメモリダンプを見ている人がパスワードを見る可能性があります。セキュア文字列または byte[] を使用し、パスワードが不要になったらすぐに破棄するかゼロにすることを忘れないでください。