web-dev-qa-db-ja.com

ユーザー名/パスワードを安全に保存する方法(ローカル)

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

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

97
Robin

入力したユーザー名とパスワードを確認/検証するだけの場合は、 Rfc2898DerivedBytes クラス(パスワードベースのキー派生関数2またはPBKDF2とも呼ばれます)を使用します)。これは、RFC2898DerivedBytesの結果からパスワードに戻る実用的な方法がないため、Triple DESやAESのような暗号化を使用するよりも安全です。パスワードから結果にのみアクセスできます。 を参照してください.Netの暗号化キーとIVをパスワード文字列から導出するときにパスワードのSHA1ハッシュをソルトとして使用してもよいですか?WinRT/Metroの場合、パスワードc#Metro Style を使用して文字列を暗号化/復号化します。

サードパーティに提供するなど、再利用のためにパスワードを保存する場合は、 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 []を使用し、パスワードが不要になったらすぐに破棄またはゼロにすることを忘れないでください。

147
akton

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

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

このリンクは私が望む大きな助けになるでしょう: ここをクリック

8
Pradip

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

4
swiftgp

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

4
Stephen Buck