web-dev-qa-db-ja.com

Windows8で機密データを保存するためのベストプラクティス

Windows 8で機密データをローカルファイルに保存する最良の方法は何ですか? oAuthトークン/パスワードを保存する必要があるC#アプリケーションを開発しています。NETではデータの暗号化/復号化が一般的であると聞きましたが、経験がありません。 Windows8アプリにはWindowsPhoneと同様の独自の個人用/保護されたストレージ領域があることを考えると、暗号化は依然として推奨/必要ですか?

また、データを要求するたびに暗号化/復号化すると、パフォーマンスの問題が発生しませんか? (カスタム/ライトアルゴリズムを作成する方が良いでしょうか?)

29
Nick

UPDATE:モダン/メトロアプリはお互いのものを突くことが制限されていますが、デスクトップアプリケーションは、これらのAPIを介して保存されたすべてのデータに無制限にアクセスできます。 http://www.hanselman.com/blog/SavingAndRetrieveingBrowserAndOtherPasswords.aspx を参照してください。これには、これを示すコードが含まれています。


Win8には PasswordVault という新しいAPIがあり、これらすべての難しい問題を処理するように設計されています。本当に使いやすく、安全で、ユーザーがマシン間をローミングするように構成できるため、資格情報を1回入力するだけで済みます。これをOAuthトークンに正常に使用しました

資格情報の取得(WinRTが発生する愚かな例外に注意してください...実際にはnullを返す必要があります):

const string VAULT_RESOURCE = "[My App] Credentials";
string UserName { get; set; };
string Password { get; set; };
var vault = new PasswordVault();

try
{
   var creds = vault.FindAllByResource(VAULT_RESOURCE).FirstOrDefault();
   if (creds != null)
   {
      UserName = creds.UserName;
      Password = vault.Retrieve(VAULT_RESOURCE, UserName).Password;
   }
}
catch(COMException) 
{
   // this exception likely means that no credentials have been stored
}

資格情報の保存:

vault.Add(new PasswordCredential(VAULT_RESOURCE, UserName, Password));

資格情報の削除(ユーザーがアプリのログアウトボタンをクリックしたとき):

vault.Remove(_vault.Retrieve(VAULT_RESOURCE, UserName));
48
Robert Levy

必要なものによって異なります。本当にパスワードを保存する必要がある場合は、3DES/RC2/Rijndaelなどの双方向暗号化アルゴリズムを使用する必要があります。

ただし、パスワードが正しいかどうかを確認するだけの場合は、一方向性関数を使用してハッシュを保存することをお勧めします。

機密データを扱うときは、Windows 8を使用している場合でも、暗号化/ハッシュ化することをお勧めします。暗号化は余分なオーバーヘッドを意味しますが、ほとんどの場合、速度の違いに気付くことはありません。

独自のカスタム/ライトアルゴリズムを作成する方がよいでしょうか?警備員として、私はそれに反対するようアドバイスします。人々は、既存のアルゴリズムの穴をテストし、改善し、見つけようと何年も費やしています。したがって、生き残ったものはかなり良いです。

0
HansPolders