124

最初にログインする必要がある Windows アプリケーションを作成しています。
アカウントの詳細はユーザー名とパスワードで構成され、ローカルに保存する必要があります。
これは単にセキュリティ上の問題であるため、同じコンピューターを使用している他のユーザーが全員の個人データを見ることはできません。
このデータを保存するための最善/最も安全な方法は何ですか?

データベースを使いたくないので、リソース ファイルでいくつか試してみました。
しかし、私はこれに慣れていないので、自分が何をしているのか、どこで解決策を探すべきなのか完全にはわかりません.

4

5 に答える 5

181

入力したユーザー名とパスワードを確認/検証するだけの場合は、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[] を使用し、パスワードが不要になったらすぐに破棄またはゼロにすることを忘れないでください。

于 2012-09-30T01:38:52.893 に答える
9

私はこれを以前に使用したことがありますが、資格情報が持続し、最善の安全な方法であることを確認するためには

  1. ConfigurationManagerクラスを使用して、それらをアプリ構成ファイルに書き込むことができます
  2. SecureStringクラスを使用してパスワードを保護する
  3. Cryptography次に、名前空間のツールを使用して暗号化します。

このリンクが大いに役立つことを願っています :ここをクリック

于 2012-09-30T01:02:45.010 に答える
5

DPAPI はまさにこの目的のためのものです。DPAPI を使用して、ユーザーが最初に入力するパスワードを暗号化し、安全な場所に保存します (ユーザーのレジストリ、ユーザーのアプリケーション データ ディレクトリなど、いくつかの選択肢があります)。アプリが起動されるたびに、場所をチェックして、キーが存在するかどうかを確認します。DPAPI を使用して暗号化を解除し、アクセスを許可する場合は、それ以外の場合は拒否します。

于 2012-09-30T01:03:19.050 に答える
4

これは Windows でのみ機能するため、dotnet コア クロスプラットフォームの使用を計画している場合は、他の場所を探す必要があります。https://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.mdを参照してください

于 2017-11-03T12:37:39.647 に答える