通过电子邮件发送登录链接是不好的做法吗?

信息安全 验证 密码 电子邮件 一次性密码 弹簧框架
2021-08-09 21:48:14

在我的 Spring 应用程序中,我计划通过向用户的电子邮件地址发送“魔术登录链接”来从身份验证过程中删除密码。然而,在这个问题中, Rob Winch(Spring Security 的负责人)说:

请注意,在允许从电子邮件中的链接登录方面,您知道自己在做什么。SMTP 不是一种安全协议,因此依赖拥有电子邮件作为身份验证形式的人通常是不好的。

真的是这样吗?如果是这样,那么发送密码重置链接如何更安全?使用魔术链接登录与发送魔术链接重置密码不是一回事吗?

2个回答

单独的魔术链接不一定是坏事。512 位完全随机的值不会比 512 位私钥更容易猜到。一般来说,在合理的时间后过期被认为是一种很好的做法。一个好方法 - 也避免存储数据库条目是在 url 中嵌入令牌数据并使用私钥对其进行签名。IE

site.com/login?type=login&user=[username]&expires=[datetime]&sig=[signature of other parameters].

然而,电子邮件作为一种传输机制并不安全。

默认情况下,SMTP 提供的拦截保护非常少。服务器之间的流量可能会被加密,但不能保证。即使使用加密,它仍然经常可以在连接中间进行操作(加密与身份验证不同)。

如果是这样,那么发送密码重置链接如何更安全?

它不是。这就是为什么一些服务会在发送链接之前(或点击链接之后)要求您提供一些额外的证明。

这里存在三个问题。

  1. 正如文档所写,电子邮件不是一种安全协议。电子邮件以明文形式存储在邮件服务器上。服务器之间以及服务器和客户端之间的加密是可选的,超出您的控制范围。而且您很可能无法使用人们在电子邮件之上构建的任何可选端到端加密系统(PGP、S/MIME 等)。因此,您不能保证除了预期的收件人之外没有人会以明文形式看到电子邮件。
  2. 秘密不属于 URL。URL 出现在浏览器历史记录、代理缓存、服务器日志和许多其他您不希望秘密信息出现的地方。
  3. 用户知道密码是如何工作的。这并不容易,但经过长期的努力,我们终于让每个人都明白,密码必须保密。使用您的系统,用户可能不知道与您的服务进行身份验证相关的秘密是什么。这使得他们可能会错误地处理这些信息并容易受到社会工程攻击。

如果您通过电子邮件发送带有秘密登录令牌的链接,那么它们应该是一次性的并且很快就会过期。