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

My applications need to send emails, where and how should I store the SMTP password?

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

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

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

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

我更愿意将加密的密码存储在应用程序的数据库中。

我花了好几个小时阅读StackOverflow上的问题,但我看不到一致意见(就像用户帐户登录凭证一样)。我觉得这很奇怪,因为我基本上期望每个开发人员迟早都会遇到这个问题。

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

请给我指一下网上的资源,说明如何解决这个问题。如果可能的话,由该领域的专家撰写。

我看过一些这样的问题:

  • 保护桌面应用程序中的用户密码(版本2)
  • Windows相当于OS X密钥链?

如果你能提供更多关于操作系统和编程语言的细节…

但是,以下是一些一般性建议:

您必须知道的最重要的一点是:如果您的应用程序能够在没有用户交互的情况下解密它(例如,用户的密码或硬件令牌),任何攻击者都可以做到这一点。您实现的所有措施都将增加获取此密码的复杂性。

当然,你应该把标准杆升得越高越好。对于Windows,DPAPI将是您的朋友。您可以在下面找到一些关于如何使用它的信息:http://www.c-sharpcorner.com/uploadfile/moessaur/dpapieprotecteddataclass1052006142332pm/dpapieprotecteddataclass.aspx with c(我不知道您使用的环境)。

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

也许其他人可以帮助你使用其他的操作系统,但是这个概念是一样的。

可能还可能使用某种类型的SSO身份验证,如kerberos、ntlm或…,但这意味着邮件服务器上的修改。