2012-01-29 9 views
29

機密データをWindows 8のローカルファイルに保存する最適な方法は何ですか?私はoAuthトークン/パスワードを格納する必要があるC#アプリケーションを開発しています。データを暗号化/復号化するのは.NETで一般的だと聞いたことがありますが、その仕組みについての経験はありません。 Windows 8のアプリケーションにWindows Phoneと同様の個人用/保護された記憶領域があることを前提に、暗号化は推奨/必要ですか?Windows 8で機密データを保存するためのベストプラクティス

また、データを要求する度に暗号化/復号化を実行しても、パフォーマンスに問題はありませんか? (カスタム/ liteのアルゴリズムを記述する方がよいでしょうか?)

+0

をあなたの脅威モデルでは?システムの管理者、または権限のない不正なソフトウェアですか? – CodesInChaos

+8

**独自のセキュリティシステムを開発しないことを強くお勧めします。** Windowsにパスワードを保存するには、_Credential Manager_(Win7以降)があります。 _WinRt_には[Windows.Security.Credentials'](http://msdn.microsoft.com/library/windows/apps/windows.security.credentials.aspx)名前空間に対応するAPIがありますが、_itの記述はまだまだ不十分です。 – ordag

答えて

48

UPDATE:は現代/メトロアプリは、お互いのもので突いてから制限されている一方で、デスクトップアプリケーションがこれらのAPIを介して格納されているすべてのデータに無制限にアクセスできるようになりますのでご注意ください。これを示すコードを含むhttp://www.hanselman.com/blog/SavingAndRetrievingBrowserAndOtherPasswords.aspxを参照してください。


Win8はあなたのためにすべてのこれらのハードの問題の世話をするために設計されていますPasswordVaultと呼ばれる新しいAPIがあります。本当に使いやすく、安全で、ユーザが自分のマシン間を移動するように設定できるため、一度認証情報を入力するだけです。私は正常にOAuthトークンのためにこれを使用しました

資格情報の取得(WinRTが発生する愚かな例外に注意してください...彼らは本当にただのヌルを返す必要があります):

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)); 
+0

コードありがとう!大きな助け。 – Nick

+0

あなたはtryブロックの_vaultedUserNameではなくUserNameを意味すると思います... –

+0

@RobertLevyパスワードボールト操作によってスローされる可能性のある例外についての情報をどこから見つけることができますか? THX –

-4

あなたは、このように暗号化することができます:

public static string EncodePassword(string password) 
    { 
     byte[] bytes = Encoding.Unicode.GetBytes(password); 
     byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(bytes); 
     return Convert.ToBase64String(inArray); 
    } 

そして、ユーザの入力をチェックするとき、あなたもこの方法にそれをトロウし、それをチェックします一致。

暗号化/復号化するXMLに入れるデータの場合は、RijndaelManagedを使用できます。

-Edit1-

例: あなたがポップアップする小さなログイン画面(にShowDialog)を持っている場合、あなたがすることができ、それがこの中略 - それが好きです:

private void settings_Click(object sender, RoutedEventArgs e) 
{ 
    Login log = new Login(); //login window 
    log.ShowDialog();   //show the login window 
    string un = log.userName.Text; //the user input from the username field 
    string pw = log.passWord.Password; //the userinput from the password input 
    if (EncodePassword(un) == Properties.Settings.Default.adminUsername && EncodePassword(pw) == Properties.Settings.Default.adminPassword) //in my case, i stored it in the app settings, but this could also be somewhere else. 
    { 
     //login was correct 
     //do something 
    } 
    else 
    { 
     //login was not correct 
    } 
} 
+2

ニックは「oAuthトークン/パスワードを保存する必要があるC#アプリケーションを開発しています」ので、チェックサムを保存して元のものを破棄してもそのトークンとパスワードを再度生成する必要があります。 – Lumi

+0

に依存します。パスワードとして使用されている場合は、ユーザー入力をメソッドにスローし、出力文字列と格納された文字列を比較できます。これはまさに私のアプリケーションの1つでもそうしています。 – Dante1986

+1

@ Dante1986:確かに、ニックがWebサイトのように、他のアプリケーション*のために資格証明書*を保存する必要があると推測しているかもしれません。ニックは、これを明確にするために、問題の説明を詳しく説明するかもしれません。 – Lumi

0

それ本当に必要な場合は、3DES/RC2/Rijndaelなどの2方向暗号化アルゴリズムを使用する必要がありますパスワードを格納する必要がある場合に必要なものに依存します。

しかし、パスワードが正しいかどうかを確認することができるようにするには、oneway関数を使用してハッシュを格納することをお勧めします。

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

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

+0

ありがとう、私のアプリは、各リクエストでoAuthトークンを提供する必要があるTwitterアプリケーションです。これらのトークンは、最初に取得するときに保存する必要があります。 私はトークンを暗号化せずにXMLファイルに保存していますが、情報の不足と暗号化に関する知識の不足のため、Windows 8の暗号化APIを使用するのは「怖い」でした。私は、Windows 8でも暗号化を使用することをお勧めしますが、Windows.Security.Credentials APIを使用して自分の道をつくろうとします。すべての助けをありがとう – Nick

関連する問題