我的应用程序需要发送电子邮件,我应该在哪里以及如何存储 SMTP 密码?

Posted

技术标签:

【中文标题】我的应用程序需要发送电子邮件,我应该在哪里以及如何存储 SMTP 密码?【英文标题】:My applications need to send emails, where and how should I store the SMTP password? 【发布时间】:2013-07-08 02:22:26 【问题描述】:

似乎我创建的每个应用程序都需要能够偶尔发送电子邮件。例如。状态电子邮件。对于这个问题,假设我的应用程序是一个备份工具,本地安装在许多 windows 客户端上,并且每次安装都需要发送每日状态邮件。它可以安装在组织的服务器或私人计算机上。

我要求用户向他拥有的电子邮件帐户提供凭据(STMP 主机、端口、用户名、密码、发件人地址)。我从 Atlassian Jira/Confluence 或 JFrog Artifactory 等应用程序中复制了这种方法。他们在哪里以及如何存储 SMTP 密码?

我目前的理解是:Salting/Hashing 方法不适用于此处,因为我需要能够检索明文密码才能实际发送电子邮件。我不想以明文形式存储密码,所以它必须是某种加密/解密方法(对吗?)。

我可以告诉用户不要使用他的主电子邮件帐户,而是使用一些辅助帐户,或者更好的是,设置一个特殊的电子邮件帐户供我的应用程序使用。如果用户是组织的管理员,他可能能够在其 Exchange 服务器上设置电子邮件帐户或配置 SMTP 中继。但是,我了解我,我也了解我的私人用户,他们中的一些人无论如何都会使用他们的主电子邮件帐户,所以我想尽我所能确保他们的凭据尽可能安全(我的意思是“遵循最佳实践")。

我最好将加密的密码存储在应用程序的数据库中。

我花了好几个小时阅读有关 *** 的问题,但我看不到共识(就像用户帐户登录凭据一样)。我觉得这很令人惊讶,因为我预计基本上每个开发人员迟早都会遇到这个问题。

必须遵循一些最佳实践,一些既定的方法来解决这个问题,但我还没有找到。

请指出我在 SO/网络上解释如何解决这个问题的资源。如果可能的话,由该领域的某个专家撰写。

我看过的一些 SO 问题:

Protecting user passwords in desktop applications (Rev 2) Windows equivalent of OS X Keychain?

【问题讨论】:

【参考方案1】:

如果您能提供有关操作系统和编程语言的更多详细信息会很好...

但是这里有一些一般性建议:

您必须知道的最重要的事情是:如果您的应用程序能够无需用户交互(例如用户的密码或硬件令牌)解密它,那么任何攻击者都可以做到它。您实施的所有措施只会增加获取此密码的复杂性。

当然,您应该尽可能提高标准。对于 Windows,DPAPI 将成为您的朋友。你可以在这里找到一些关于如何使用它的信息,例如:http://www.c-sharpcorner.com/UploadFile/mosessaur/dpapiprotecteddataclass01052006142332PM/dpapiprotecteddataclass.aspx with C#(我不知道你使用的是哪个环境)。

您还可以实现自己的配置并使用存储在本地密钥容器中的密钥使用 RSA 对其进行加密 - 请参阅 http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider%28v=vs.100%29.aspx。

也许其他人可以在其他操作系统方面为您提供帮助,但其中的概念将是相同的。

还有可能使用某种 SSO 身份验证,例如 Kerberos 或 NTLM 或...,但这意味着在邮件服务器上进行修改。

【讨论】:

以上是关于我的应用程序需要发送电子邮件,我应该在哪里以及如何存储 SMTP 密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 从文件夹中通过电子邮件发送随机 pdf 文件?

Laravel 5 - 我应该在哪里编写这个函数,以及如何编写?

我应该把我的 .jasper 文件放在哪里以及如何访问它? [复制]

我应该把这段代码放在 Laravel 的啥地方?

发送邮件与 SMTP

我应该如何使用 Outlook 发送代码片段?