由于电子邮件不受HTTPS保护,因此通过电子邮件向用户发送密码的安全性如何。

保护密码安全的最佳方法是什么?我应该使用加密吗?

评论

不,不,不,不,不!永远不要在电子邮件中使用纯文本密码。 Infact绝对不会发送密码。

值得阅读特洛伊·亨特(Troy Hunt)在英国领先的超市Tesco上的博客文章,通过电子邮件发送密码。 troyhunt.com/2012/07/lessons-in-website-security-anti.html

没有永不。我们甚至羞辱了那些在plaintextoffenders.com上做的事情。

@SimonWhitaker有趣的是,您曾发布过-我一直在积极参与该活动,以促使他们进行修复! :)

您可以向用户发送密码的事实意味着您以纯文本或至少可逆密码存储用户密码。仅此一个就可以引起危险信号。

#1 楼

永远不要以明文形式发送密码,也不要以明文形式存储密码。您应该使用慢速单向加密哈希(例如bcrypt或PBKDF2)对它们进行哈希处理。如果用户忘记了密码,则可以为他们提供“重置密码”功能,该功能会将一次性重置链接发送到其帐户。

如下所示的方案是合理的:


使用salt加bcrypt / PBKDF2哈希所有密码。在这里查看我的推理。 (编辑,2019年3月:使用Argon2)
在登录时验证哈希值。
如果用户忘记了密码,请使用存储在数据库中的随机生成的重置令牌向他们发送一次安全的一次性重置链接。令牌必须是唯一且秘密的,因此请在数据库中对令牌进行哈希处理,并在使用链接时进行比较。
强制令牌只能用于重置请求令牌的用户的密码。
一旦使用了令牌,就必须将其从数据库中删除,并且不允许再次使用。 48小时。这样可以防止攻击者在以后利用未使用的令牌。
立即显示一个表单,以允许用户设置新密码。不要使用随机生成的临时密码!
通过SSL进行所有这些操作。

我强烈建议您阅读《基于表单的网站身份验证权威指南》,以获取有关如何进行身份验证的全套指南构建安全的登录系统。

评论


+1根本问题与电子邮件无关。根本问题是密码是以明文形式或以可逆加密方式存储的。解决该问题,电子邮件问题会自动回答。

–菲尔
2012年8月1日14:06

@drjimbob实际上很有效,它与重置链接没有什么不同,没有自动登录和选择帐户部分。

– ewanm89
2012年8月1日在18:05

@Wug在设定的时间范围后,您无法轻易撤消临时密码。这也使用户感到困惑,因为尽管电子邮件说新密码有效,但他们仍会失败登录。此外,重置链接会强制用户立即更改其密码,从而降低了以后临时密码被盗的风险。我也不明白您的HTTPS参数-为什么像https://example.com/reset?token = 123 ...这样的链接在登录时导致明文发送令牌?

–多项式
2012年8月1日19:49



@Wug Erm,我认为您误解了HTTPS。整个HTTP对话(包括GET参数)都封装在SSL流中。去拿一份Wireshark的副本,并亲自验证一下。

–多项式
2012年8月1日19:53



整个请求URL在HTTPS中加密;这就是为什么必须将安全域托管在专用IP地址上的原因,因为证书的选择不能基于请求地址,因为直到协商了会话之后,服务器才可以使用该信息。即使这样,如果令牌是一次性使用的,那么以纯文本形式发送令牌会带来什么危害呢?等到有人可以观察到的时候,它就不再起作用了。

–亚当·罗宾逊(Adam Robinson)
2012年8月1日在20:03



#2 楼

电子邮件不安全。因此,通过电子邮件发送密码存在安全风险。为了减轻风险,您可以(在某些情况下)做到这一点,以使通过电子邮件发送的密码是一次性密码,这仅使用户无法选择自己的新密码。

这就是我在此网站上忘记密码的好系统:用户单击“该死,我忘记了密码”按钮,并发送一封包含URL的电子邮件(使用HTTPS)(嵌入一个随机会话标识符),并指向允许用户选择新密码的页面。该URL是“一次性密码”。使用此方案,您至少可以从服务器端知道URL的使用时间。

如果可以正确地进行加密,即是否可以发送使用以下代码加密的OpenPGP或S / MIME消息,用户的公共密钥,那么用户就有一个私钥/公共密钥对:在这种情况下,为什么还要使用密码?

评论


那么,是什么阻止了使用该链接重置用户密码的中间人劫持电子邮件中的链接?

–起搏器
2014-12-12 8:28



#3 楼

将密码发送给用户是不明智的做法,因为这将意味着您拥有用户密码的明文副本。

我认为没有充分的理由这样做。还有其他更安全的方式来完成所需的工作。

有关电子邮件安全性的一般答案,建议您阅读此链接,其中包含一些有用的信息。

如果您必须通过电子邮件发送敏感信息,请使用类似PGP或其他加密技术的方案来保护数据。

评论


这不是真的;您可以在提交创建密码后创建一封电子邮件发送给用户。在某个时间点,您将始终以明文形式输入密码。虽然我同意在创建帐户后通过电子邮件发送密码并不明智,但这并不意味着密码存储不足。您可以将密码存储在PBKDF2 SHA-512中,并发送10k信号,这并不意味着您无法通过电子邮件发送用户选择的密码。

– NKCSS
2012年8月1日14:12



@NKCSS:总有一天,有人会使用其共享的工作邮件以及个人密码将帐户注册到您的网站。

– Lie Ryan
2012年8月1日16:00

@NKCSS是的,您可以在存储密码之前立即发送密码,并且存储解决方案可能是安全的。但是,明文发送密码仍然很不安全。不必理会Lie Ryan提出的建议,您还应该担心谁在收听电子邮件对话。用户可能正在使用一种服务,该服务在服务器之间或客户端之间明文传输电子邮件。出于其他原因,请参阅我关于此主题的答案,以免出于保密原因不信任电子邮件。

–伊兹
2012年8月2日,0:07

#4 楼

如果您首先要发送“清除密码”(除了注册过程之外),那么您做错了。永远不要存储纯文本密码!最近,诸如Sony Music之类的许多公司都被烧死了..让我告诉你,消费者不满意。

评论


为了清楚起见(不希望您使用的是双关语),绝对不要发送明文密码-即使在注册过程中也不要。是的,根据该过程的性质,您可能会在注册过程中获得密码的明文(或加密)副本,但应立即将其盐化,散列并存储在安全数据库中-永远不会发送或显示给用户。

–伊兹
2012年8月2日0:00



#5 楼

与以前的帖子相呼应,电子邮件肯定是不安全的,并且您绝不应该通过电子邮件发送任何敏感数据,尤其是密码。尤其是由于它们未加密且我们以明文形式找到,因此任何人都非常容易侵入您的电子邮件并通过公共网络访问这些电子邮件。

如果您或您的客户在记住密码时遇到问题,则应使用安全的密码管理器。这是一个在完全加密的保管库中包含您的密码列表的网站。好的是KeePass或LastPass。

如果您是一家试图再次向客户发送密码的公司,则应设置安全问题,以便客户在最初创建帐户时回答。这样,如果他们忘记了密码,则可以单击将其发送给他们的链接,以正确回答这些问题并重置密码。

就您所知,这是一个内容丰富的博客,它对加密进行了说明,并警告您不要使用某些密码http://www.ziptr.com/blog-last-4-digits-ssn -来自Ziptr的密码。

评论


仅供参考:KeePass不是“网站”。这是一个应用程序。而且,默认情况下,它不会同步到云。我相信有插件可以将其与DropBox或其他云存储服务同步。

–伊兹
2012年8月1日23:57