在Windows 8中保存敏感数据的最佳实践

Nic*_*ick 29 c# windows-8 windows-runtime passwordvault

在Windows 8中将敏感数据保存到本地文件的最佳方法是什么?我正在开发一个需要存储oAuth令牌/密码的C#应用​​程序.我听说在.NET中加密/解密数据很常见,但我对这些机制没有任何经验.鉴于Windows 8应用程序拥有类似于Windows Phone的个人/受保护存储区域,是否仍建议使用加密?

此外,每次请求数据导致性能问题时,都不加密/解密?(编写自定义/ lite算法会更好吗?)

Rob*_*evy 48

更新:请注意,虽然现代/都市应用程序不会互相攻击,但桌面应用程序可以无限制地访问通过这些API存储的所有数据.请参阅http://www.hanselman.com/blog/SavingAndRetrievingBrowserAndOtherPasswords.aspx,其中包含演示此操作的代码.


Win8有一个名为PasswordVault的新API ,旨在为您解决所有这些难题.用户非常容易使用,安全且可以在其计算机之间漫游,因此他们只需输入一次凭据即可.我已成功将其用于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
}
Run Code Online (Sandbox Code Playgroud)

存储凭据:

vault.Add(new PasswordCredential(VAULT_RESOURCE, UserName, Password));
Run Code Online (Sandbox Code Playgroud)

删除凭据(当用户单击应用中的注销按钮时):

vault.Remove(_vault.Retrieve(VAULT_RESOURCE, UserName));
Run Code Online (Sandbox Code Playgroud)