设置自己的登录与通过外部服务登录

53 阅读7分钟

设置自己的登录与通过外部服务登录

在我们深入研究各种验证用户的方法的比较之前,有必要先回答一个主要问题。为什么一个网站、应用程序或服务需要有登录流程?没有它就无法满足用户群的需求吗?

由于用户体验(UX)在留住用户方面起着举足轻重的作用,登录流程需要做到无缝和直观。同时,数据隐私和安全也不能受到影响。由于有这么多因素在服务的登录和注册部分发挥作用,最初可能看起来是一个小的组成部分,但却变成了一个重要的组成部分。

认证的需要

今天互联网上的任何解决方案都是由互动内容组成的,比如对文章的评论或预约。所有这些互动都是对数据库进行四种主要的CRUD操作(创建、读取、更新和删除)之一。所有这些,除了读操作之外,都应该至少进行认证。(如果服务模式是基于完全匿名的,你可以避免这一步骤。即使在这种情况下,你也应该加入速率限制或其他方法来防止滥用)。

读取操作也应该在某种程度上被验证。例如,如果一个用户在网上订购东西,只有相关的供应商能够看到用户的手机号码和地址,而查看这篇文章不需要认证。

假设你在你的服务上的一个帖子得到了10k的评论,或者你在电子商务网站上推出产品后的几个小时内得到了1k的订单。这些事件都在更新数据库,如果不经过认证,就会导致一个或多个这样的情况。

  • 无法将评论/订单映射到做这些事情的相应用户。
  • 部分或完全拒绝服务(DoS)。这些更新可能是由一个恶意的脚本完成的,在电子商务(和类似的)服务中,如果产品数量有限,就会导致它们不能满足相关用户的需求。

Unless secured,the database can be compromised

登录-注册流程的基本设置

登录-注册是任何服务的第一道安全防线。如果这道防线被攻破,恶意的用户就可以访问不允许的数据。登录界面也应该在这个过程中验证用户的访问级别--如果是电子商务,则是供应商、送货员、买家等,如果是博客,则是编辑、作者、浏览者,对于其他服务也是如此。

最起码,认证应该是基于用户名/电子邮件和密码,甚至可以通过多因素认证来进一步保证。为了确保用户的隐私和保护,密码必须在任何地方被存储,并在传输时被加密。

在散列时要记住一些要点

  • 使用哈希函数,而不是加密,不管加密有多安全。在登录和注册流程中,没有任何功能或设施是加密方法所不能提供的。
  • 使用带有盐的强大的散列方法(最好是随机的盐;对所有的密码使用相同的盐会使盐化变得徒劳)。像MD5这样的散列算法对于今天的计算能力来说太弱了,因此相对来说是不安全的。
  • 此外,旧的散列标准有多个已知的碰撞对。碰撞是指两个不同的输入给出相同的哈希值作为输出的事件。

在当今超快的计算机中,明智的做法是对密码进行多次散列,以确保暴力攻击的尝试需要更多的计算能力,反过来又使每次暴力试验变得耗时。

保护你的应用程序的其他方法

  • 慢一点。在这个高速互联网的时代,慢一点怎么会有好处呢?
  • 一个错误的密码输入在下一次尝试之前应该有一个冷却的时间。这可以从第一次尝试开始(几百毫秒)或在几次尝试后(可能是三次或五次)。冷却时间将在用户体验和安全立场之间达成共识后决定。这种冷却应该在服务器端而不是客户端完成,因为客户端的脚本更容易被操纵。此外,当在客户端进行时,一个脚本可以有多个客户端实例并行运行,这将绕过客户端的保护。
  • IP速率限制。当IP速率限制被纳入时,有几个指针需要记住。在共享互联网连接环境中,如办公室、教育机构或家庭Wi-Fi,严格的IP速率限制可能会导致用户体验问题。解决这个问题的一个方法是,在网站上设置一个验证码来保护网站,同时制定一个IP速率限制政策,规定用户是否可以在共享的互联网连接上使用你的服务。
  • 只有经过验证的账户 - 所有注册的用户都必须通过电话(短信或电话)或电子邮件进行验证。如果没有经过验证的账户,任何用户只要知道一个随机的人的电子邮件或电话(这相对容易获得),就可以使用他们的凭证建立一个账户。
  • 以正确的方式做重置密码--生成的重置密码链接必须是唯一的和一次性的。想象一下,如果不执行单次使用的情况,那么我可以拿起我朋友的手机,如果看到任何重置密码链接,我就可以去再次修改密码。同样重要的是,要有一个重置请求有效的时间限制。

使用外部服务进行登录

有各种外部服务(如谷歌、GitHub)可用于服务的登录和注册流程。这减少了用户群安全所需的资源,因为它们是由这些外部服务使用OAuth2协议来管理授权的,这也是目前的行业标准。由外部服务来管理登录和注册有很多好处,但在一些使用情况下,使用外部服务可能是不明智的。

通过外部服务进行OAuth的好处

  • 注册的用户体验得到加强,因为大多数用户只需要点击并授权使用该服务来注册,而不需要填写单独的表格。
  • 通过OAuth2,密码散列、IP速率限制、密码重置和其他操作都可以开箱即用。
  • 用户对你的服务获得了更多的信任,因为你没有保存他们敏感的登录信息,而是由一个著名的外部服务来管理。

关于外部服务的一些要点

  • 由于外部服务在用户管理中起着关键的作用,注册和登录流程将有一些他们的品牌元素,而不仅仅是你的品牌。
  • 你可能仍然需要一个注册表来获取服务所不提供的额外信息。
  • 虽然很罕见,但这种外部服务的中断会使你的服务的认证失败,即使是你的服务上的合法用户。
  • 在使用高峰期,这些外部服务可能无法提供巨大的负载,因为他们对使用其OAuth的每个服务都有速率限制。
  • 请确保你在使用OAuth的服务上有适当的隐私政策,这在获得使用OAuth的API-key许可时起到了作用。

最后说明

在深入了解了管理服务的登录和注册机制的选项后,我希望你能更好地管理你的服务的用户认证。为了获得更详细的见解,我将在这里提出一些关键词,你可以在网上搜索,以获得进一步的信息。请确保你在做这些决定的时候,一直保持着最新的文章,因为安全标准和协议会定期更新。

关键词。OAuth, JWT, Hashing and Salt, SHA-2, "Adobe encryption password breach", Brute-force attack, Rainbow Tables, IP Rate Limiting