.NET 中的本地密码存储

Local Password Storage in .NET

我正在编写一个使用 REST 与远程 Web 服务通信的 WPF 应用程序。该应用程序要求用户输入用户名和密码,因为 REST API 的某些功能需要身份验证。我想知道如何在我的 WPF 应用程序中安全地存储密码。在服务方面,我通过用随机盐腌制它来存储它,然后使用 SHA256 对其进行哈希处理。我是否应该创建一个 returns 安全密码(即散列和加盐密码)的 REST 命令,并在使用 REST 时将其提供给服务器?

根本不要将其存储在本地。通过 HTTPS 将其传递给服务器,并让服务器 return 有一个身份验证令牌,可用于后续调用而不是登录。令牌可以只是任意随机数,与特定用户无关,除非通过服务器上的映射。您正在为 REST 调用使用 HTTPS,对吧?您将需要登录和注销功能,登录以生成身份验证令牌并注销以使其无效,此外,您可以在令牌上设置到期日期以限制其有效时间。

如果每次 he/she 启动 WPF 应用程序时都可以提示用户输入用户名和密码,那么请将凭据保存在内存中。您可以使用 SecureString 将密码保存在内存转储之外。

如果您不想在每次 he/she 启动应用程序时都提示用户输入凭据,请查看使用 OAuth 2.0。您的应用程序将使用户通过授权服务器进行身份验证。此服务器 returns 既是访问令牌又是刷新令牌。您可以使用访问令牌与 REST 通信 API 并且可以使用刷新令牌在到期时获取新的访问令牌。

如果您想将刷新令牌安全地存储在用户的计算机上,请查看 Windows 数据保护 (DPAPI) 以在存储之前加密令牌。