在网络应用程序中,用户注册后通过电子邮件发送用户名和密码

14

对于在我们的网站上注册时将用户名和密码发送到他们的电子邮件地址,您的意见是什么? 这样,如果他们将来忘记密码,他们可以在电子邮件中查找。同时,我们也不必实现忘记/重置密码的场景(我们即将发布)。

这种方法足够安全吗?

  1. 我的第二个问题基本上是关于我们的网站,用户填写某些表格并输入一些信息,例如他们的姓名,地址,电话号码,收入信息等个人信息。最后,当他们提交申请时,我们考虑向他们发送所有这些信息的摘要,例如其名称,地址等,以便他们记录。

这样可以吗?足够安全吗?有哪些顾虑?


3
或许不值得单独发布回答,只是一个想法……你考虑过使用OpenID吗?它可以避开很多账户注册和密码安全方面的问题,因为你实际上从未接触到用户的密码,如果他们忘记了密码也不需要你来修改。 - rmeador
这可能并不是回答问题的方法,但值得一提。如果您的受众在技术上足够熟悉OpenID,那么请使用它。 - Noah Medling
同意。我喜欢OpenID解决方案。 - jinsungy
12个回答

25

永远不要在明文中发送密码或其他敏感信息。这包括电子邮件。您还应该尽可能少地以可恢复的格式存储此类信息。未加密的通信,特别是电子邮件,很容易被篡改,你不希望错误的人获取密码。

如果可能:

  • 将密码存储在加盐哈希中,以使原始文本无法恢复,因此除了暴力攻击之外无法破解。如果用户忘记了他/她的密码,请让他们重置密码并通过电子邮件发送一个临时密码(他们需要在登录后更改密码)或确认链接(再次提示设置新密码)。

  • 永远不要通过电子邮件发送任何敏感信息;如果用户需要信息,请让他们去您的网站获取。您正在使用HTTPS,对吗?


2
你说永远不要以明文形式发送密码,但你建议通过电子邮件发送临时密码。电子邮件==不安全。 - jinsungy
1
因此需要在登录时更改密码。通过电子邮件重置密码无论如何都不安全(无论是临时密码还是URL);希望在攻击者能够获取信息之前,任何在过程中传输的信息都已经过时。唯一真正的替代方案是秘密问题机制,可以通过安全协议完成,但是提出的问题大多数潜在攻击者都可以轻松查找,因此比电子邮件甚至更不安全。 - Noah Medling
1
希望在过程中传输的任何信息都已过时。如果用户一周内没有查看电子邮件怎么办?信不信由你,这种情况确实发生过。攻击者可以轻松获取临时密码。发送给用户的电子邮件中唯一的内容应该是“您的电子邮件已重置”。 - jinsungy
2
将通过电子邮件发送的“重置密码”链接在有限时间内保持“有效”,并在密码重置后失效,应该有助于解决用户忘记检查“忘记密码”电子邮件(并在使用后不删除它们)的问题。请参阅此有趣的博客文章:http://www.plynt.com/blog/2011/09/forgot-pwd/ - Maxime Pacary
仍然无法解决中间人攻击问题。中间人可以在你之前获取到你的一次性密码,并使用它来重置你的密码。实际上,中间人可能是请求你的密码重置的那个人,而不是你自己。这给了他足够的时间来重置你的密码,直到你注意到有什么不对劲。 - Pacerier

5
人们经常在不同的网站之间共享密码。因此,您应该假设相同的密码适用于客户的在线银行,并且不应通过电子邮件发送密码或提供让(假冒客户的)用户检索密码的方式。
向他们发送带有用户名的确认电子邮件是可以的,这很有用。
请记住,如果您通过电子邮件发送密码,他们很可能会忘记那封电子邮件,或者只会删除它。 因此,您仍需要另一种密码重置机制。
处理“忘记密码”情况的最佳方法是要求用户请求您通过电子邮件向其发送链接;当他们单击链接时,您允许他们输入新密码。
关于个人信息(地址、收入等):为什么要将这些信息发送给他们呢?他们已经知道了!您只是无缘无故地通过互联网发送私人数据而没有加密。

4

我的经验法则是——如果您愿意在明信片上写下它并通过邮件寄出,那么这样的内容就适合普通电子邮件。对于大多数人来说,我不认为收入信息属于这个范畴。

至于密码,如果他们一开始就无法记住密码,他们将无法找到您发送给他们的带有密码的电子邮件,并且这相当于承认密码被以明文形式存储。我建议避免这种情况,并提供重置密码的手段,他们终究会需要它。


2

我同意最佳答案,并补充一点:每次我收到包含我的密码的注册确认电子邮件时,我会删除该电子邮件,并且强烈考虑再也不使用该网络服务。对我来说,这表明缺乏安全和隐私意识。


2
问题在于发送带有密码的电子邮件。如果没有正确加密,某人可能会嗅探从正在发送的电子邮件中获取密码的数据包并恢复密码。此外,该人可能会拥有被劫持的电子邮件帐户。如果某人窃取密码不是什么大问题,那么您可能不必担心,但否则我建议不要通过电子邮件发送任何未加密的密码。
编辑:为了回答您的第二个问题,我甚至不会发送电子邮件。相反,我会发送一个链接,这样他们登录后可以轻松查看自己的个人资料/信息。

2

我告诉人们把电子邮件想象成明信片——在发件人和收件人之间处理邮件的任何公司员工都可以阅读它。


2
当您通过电子邮件发送任何信息时,它不会安全。有太多的方式可以获取它。对于想要窃取您信息的熟练黑客来说,这将是小菜一碟。 请勿通过电子邮件发送任何个人信息,例如密码和收入信息,因为如果此类信息泄露或被盗用,这将非常令您和您的组织尴尬。认真考虑安全问题。只需要那一个事件,所有积木就会倒塌。
至于密码找回,请仔细阅读忘记密码最佳实践

关键是应用程序应该遵循最佳实践,允许用户重置自己的密码。应使用个人安全问题。应用程序不应发送电子邮件,显示密码,也不应设置任何临时密码。

编辑:更新链接...

假设该网站已经使用SSL进行了安全保护! - jinsungy
而且问题的答案不容易被猜测或查找。例如,我母亲的婚前姓氏是公开记录。 - Noah Medling
常识告诉我们,只有一个安全问题是不够的,尤其是像母亲的婚前姓氏这样的问题。请使用多个非弱安全问题。 - jinsungy
链接指向的资源“页面未找到”。我认为这个PDF文件已经被删除或移动到其他地方了。请使用此URL:http://www.fishnetsecurity.com/6labs/resource-library/white-paper/best-practices-secure-forgot-password-feature - Znik

1

大多数公司由于外部电子邮件客户端的安全性问题,通常不包括用户名密码组合。任何数量的用户都可以通过暴力破解或猜测另一个用户的电子邮件帐户密码,这将允许黑客查看您网站的电子邮件。然后黑客也可以对您的网站造成严重破坏。


1
我认为提供一个忘记密码功能仍然非常重要,因为并不是每个人都能保证保存所有的电子邮件(甚至能够在以后找到它们)...

0
我构建了一个网络应用程序,用于通过电子邮件发送敏感信息。它的UI不完美,但非常安全且运行非常好。
有一个Outlook插件、API可连接外部网站和网站。
概念是您收到的邮件不是明文。这是一封包含链接的HTML电子邮件。您需要单击链接才能访问电子邮件的内容。访问一次后,消息将被销毁。
消息存储在我们这边的加密数据库中。您可以配置一个密码,只有双方知道该密码才能在线打开消息,或者通过短信接收一个密码(随机6个数字)。
通过API非常简单实现。
这里有一个示例:
// https://www.secure-exchanges.com/API.aspx
 List<string> files = new List<string>();
  files.Add(originalFilePath);
  string input = $"{body}";
  string inputSubject = $"Your {subject}";
  SendMessageAnswer answer = MessageHelper.EncryptMessage(new EncryptMessageArgs(GlobalSettings.bindingSecure, GlobalSettings.serial, GlobalSettings.ApiUser, GlobalSettings.ApiPassword, input, inputSubject + " - to open", recipient1, "", password, null, SecureExchangesSDK.SecureExchanges.SendMethodEnum.onlyEmail, false, true, true, "fr-CA", 1, 5)
  {
    FilesPath = files
  });
  if (answer == null || answer.Status != 200)
  {
    throw new Exception($"Impossible d'envoyé un message : {methodName}");
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接