29

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

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

4

3 に答える 3

48

更新:モダン/メトロアプリはお互いのものを突くことが制限されていますが、デスクトップアプリケーションはこれらの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));
于 2012-01-29T12:55:24.113 に答える
0

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

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

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

独自のカスタム/ライト アルゴリズムを作成した方がよいでしょうか? セキュリティ担当者として、私はそれに反対することをお勧めします。人々は何年もかけてテストし、改善し、既存のアルゴリズムの穴を見つけようとしています。したがって、生き残ったものは非常に優れています。

于 2012-01-29T10:52:53.620 に答える
-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 を使用できます。

-編集1-

例: ポップアップする小さなログイン画面 (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
    }
}
于 2012-01-29T10:35:12.407 に答える