存储密码以避免用户交互

信息安全 密码
2021-08-30 11:48:47

我正在创建一个向用户发送电子邮件的 Windows 服务。它使用 Gmail 帐户发送电子邮件,因此需要密码才能访问该帐户。它还需要自动执行此操作,无需用户交互。如何安全地存储密码,以便应用程序可以通过 Gmail 进行身份验证?

到目前为止,我能想到的选项是:

  1. 硬编码密码
  2. 将密码保存在具有受限权限的纯文本文件中

在 Windows 环境中,这两种方法都不是很安全。

4个回答

我认为 google 的 SMTP 服务器支持 OAuth,因此您实际上不必存储密码。这需要(一次性)用户交互来设置,但无论如何您都必须要求用户注册,因此当您这样做时,您还可以建立到 Google 的 OAuth 链接。Google 的帮助站点中查看更多信息

您可能希望使用 DPAPI 在 Windows 中安全地存储密码。这将使您保持密码加密,Windows 将为您管理密钥,并且可以将其锁定给用户或应用程序。当然,具有管理员权限的用户可以获得密钥。欲了解更多信息:http: //msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx

您还可以通过隔离存储使查找密码的位置变得更加困难:http: //msdn.microsoft.com/en-us/library/3ak841sy (v=VS.100).aspx 。话虽如此,隔离存储并不是一种安全机制。

要保护密码,您需要保护对文件的访问。这意味着只有受信任的用户才能对服务器进行物理访问(它应该在锁定的服务器机房中)或远程访问(文件共享、远程桌面等)。

如果您要分发应用程序,密码(和用户名)应存储在配置文件中,以便其他用户可以将其配置为使用自己的用户和密码。(而且他们还需要保护自己的服务器。)

我会说因为它是 .NET,并且反编译涉及下载 ILSpy 并花费大约 30 秒的时间阅读您几乎原始的源代码(包括变量名)......我可能什至不会打扰,除了将所有请求发送到您拥有的服务器将进行身份验证,任何不是终端懒惰的人都可以解密密码,无论您在本地存储的文件上花费多少时间进行高度加密。

我可能会这样做,以便您可以更改 SMTP 服务器,并确保如果软件被重新分发,他们会分发具有空白 SMTP 服务器设置的软件,如果没有,则基本上注销 GMail 帐户。


如果你想感觉更安全一点,你可以放入一些简单的东西,比如 AES 密钥 + 加密密码,并将其用作配置文件,但这不会阻止任何有能力的程序员,但至少您没有花费数天或数周时间尝试开发过于复杂的东西,而我仍然可以在相同的时间内破解(因为我只需将您的 .exe 添加为资源,执行调用以提取您的配置,并且读取内存中的原始变量)。

尽管您也可以只使用 base64,因此它不是原始的(因为这很愚蠢),因为正如我所说,您所做的任何事情都相当容易破解。