【问题标题】:c# store locally a password used for online verificationc#在本地存储一个用于在线验证的密码
【发布时间】:2026-01-30 12:15:01
【问题描述】:

我想知道解决此问题的最佳方法是什么。基本上,我的程序将表现得像用于 PC 的 Steam 应用程序,或自动登录用户的 Spotify。

换句话说,用户在我们的网站上创建了一个在线帐户。使用此帐户登录名(电子邮件和密码),他们可以登录我们的 c# 应用程序并访问该程序的功能。

我的工作正常,因为 c# 应用程序通过 Internet 安全地连接到配备 SSL 的 Web 服务,该服务访问网站的数据库并验证登录信息。我希望这一步是自动化的,所以一旦他们启动程序,只要他们之前至少登录过一次,它就应该自动登录。

在不损害登录信息安全的情况下,最好的方法是什么?

【问题讨论】:

  • 从安全角度来看,任何自动登录方案的问题是,如果其他人(不是您经过验证的用户)试图从您用户的计算机访问应用程序,即使他们可能会允许他们进入未经验证用户的许可或代表他们行事。如果您确实想保护已验证用户的信息,请不要实现自动登录。
  • 由于我的程序的性质,实际上有两个登录。首先是站点帐户,然后是本地数据库用户。因此,即使不打算使用该程序的人尝试登录,即使在第一步自动登录,他们仍然需要数据库用户密码。
  • 您的担忧当然是有道理的,但我认为就我而言这不是问题。由于我有这个双重登录系统,这是自动登录的另一个原因,因为它将为最终用户删除一个步骤。

标签: c# winforms passwords


【解决方案1】:

好的,如果我没有正确理解您的问题,您希望安全地存储用户 ID 和密码。并在应用程序启动时使用它们登录。

它有两个部分

  1. 存储 - 这些数据的保存位置
  2. 安全性 - 如何保护密码

  3. 您可以在许多位置保存这些信息。应用程序配置文件、注册表、INI、本地存储、数据库等。我将由您决定。

  4. 这是保护密码的关键部分。您可以使用三重 DES 或 AES 加密来保护密码。或者,您也可以使用 Windows 数据保护 API (DPAPI),它使用操作系统生成和受保护的密钥以及三重 DES 加密算法来加密和解密信息。在 c# 中,您可以使用 System.Security.Cryptography.ProtectedData 类来解决这个问题。

希望这会有所帮助。

【讨论】:

  • 如果这个加密密码对用户可见,会不会有问题?或者任何其他窥探计算机的用户?假设我将它存储在注册表中,因为这已经是我存储电子邮件的位置,有没有什么办法可以反转这个加密字符串?
  • 使用正确的加密方法,任何人都很难解密。
  • 好的,我会调查的。谢谢!
【解决方案2】:

创建一个数据库表,假设它被称为 userlogged。 每次用户成功登录时创建一个 GUID。将该 GUID 存储在 userlogged 中并将其返回到您的 c# 应用程序,以便可以将其存储在本地(您可以对其进行加密,使用 windows 注册表(regedit)或任何您想让它变得更难的东西任何人都可以复制它)。

下次如果 GUID 存储在本地,它将被发送到您的应用程序,您的应用程序将记录用户,并创建一个新的 GUID,该 GUID 也将发送到本地存储(这样,以防有人复制 GUID不会有 2 个用户同时登录)。

如果记录失败,请从数据库中删除 GUID。

还设置一个标志,以便如果用户已从 GUID 登录,他将被要求再次登录以进行一些与安全相关的操作,例如更改密码。

【讨论】: