授权计算机访问Web应用程序

9
我有一个Web应用程序,我的任务是添加安全登录以增强安全性,类似于Google添加到Google账户的内容。
使用情况: 基本上,当用户登录时,我们希望检测用户是否先前已经授权过此计算机。如果计算机没有被授权,那么用户将收到一次性密码(通过电子邮件、短信或电话呼叫),并需要输入该密码,用户可以选择记住此计算机。在Web应用程序中,我们将跟踪授权设备,允许用户查看他们上次从该设备登录的时间/地点,并取消授权任何设备(如果他们选择这样做)。
我们需要一个非常轻量级的解决方案(即不需要客户端软件安装),并且与Safari、Chrome、Firefox和IE 7+(不幸的是)兼容。我们将提供x509安全性,这提供了足够的安全性,但我们仍然需要为无法或不会使用x509的客户提供解决方案。
我的意图是使用cookie存储授权信息(或者,潜在地使用本地存储,降级到Flash cookie,然后是普通cookie)。
乍一看: 跟踪两个分离的值(本地数据或cookie):表示安全登录令牌的哈希,以及设备令牌。这两个值都由Web应用程序驱动(并记录),并由客户端指定。SSO令牌取决于设备以及序列号。这有效地允许设备被取消授权(所有SSO令牌变为无效),并通过使用序列号和使用nonce来减轻重放攻击(虽然不是很有效,这就是我提出此问题的原因)。
问题: 使用此解决方案,有人可能只需复制SSO和设备令牌,并在另一个请求中使用。虽然序列号将帮助我检测此类滥用并因此取消授权设备,但检测和响应只能在有效设备和恶意请求都尝试访问后发生,这给了足够的时间造成损害。
我觉得使用HMAC会更好。跟踪设备、序列号、创建nonce、时间戳和哈希以及私钥,然后发送明文的哈希加上这些值。服务器也会这样做(除了验证设备和序列号之外),并进行比较。这似乎更容易,更可靠……假设我们可以安全地协商、交换和存储私钥。
问题: 那么,如何安全地协商授权设备的私钥,然后安全地存储该密钥呢?如果我同意使用本地存储或Flash cookie存储私钥并且只说“足够好”,那么是否更有可能?或者,我是否可以对我的原始草案进行一些处理来减轻我所描述的漏洞?
2个回答

6
我猜想你需要的安全性超出了系统本身所能提供的范围。简单来说,如果你无法控制客户端,它可以以各种(意外的)方式使用SSO和设备令牌,正如你所知道的那样。无论你设计系统的其他部分有多好,这都是系统的致命弱点。
换句话说,在你描述的系统中,你正在要求并信任客户端的Web浏览器提供其设备令牌和SSO令牌。对吗?如果是这样,你如何防止这些令牌移动到其他设备上?(请参见以下缓解策略。)
现在,考虑到这一点,直接回答你的问题:
“那么,我如何安全地协商授权设备的私钥,然后安全地存储该密钥?”
这样做不会有害,但并不能帮助你,就像我上面解释的那样。
“如果我只将私钥存储在本地存储或Flash Cookie中,并说这已经足够了,是否更有可能实现?”
我无法告诉你什么是“足够”的。你应该清楚地传达“移动令牌”攻击,并帮助客户做出明智的决定。
“或者,我是否可以对我的原始草案进行某些修改以减轻我描述的漏洞?”
肯定有缓解策略,这取决于你的用户安装基础和你对风险的容忍度。
关键问题在于,考虑一下可能从一台机器移动令牌的人的技能和能力 - 你的缓解策略是否可以显著减少这种行为,而不会降低“诚实”用户的系统性能和可用性?
以下是一些想法:
  • 您可以使用双重认证,例如RSA SecurID。这不会防止机器令牌的移动,但它需要TFA与其一起移动。

  • 您可以尝试混淆或隐藏这些令牌的本地副本,但这似乎只是通过模糊来实现安全。

  • 您可以检查计算机的MAC地址。如果克隆MAC地址比移动设备令牌更困难,则可能是有用的安全层。

  • 您可以尝试要求使用某些定制浏览器,以“锁定”对这些令牌的访问。这只是一个想法;我不知道它是否切实可行。

  • 如果您知道机器不应物理移动,则可以检查网络属性以查找机器处于不同的网络位置,从而确定其物理位置。

  • 如果您查询并存储(在服务器上,而不是客户端上)计算机配置信息,则可以检测令牌是否从具有一个配置的机器移动到具有不同配置的机器。(当然,这种方法在机器升级时会出现问题。)

  • 您可以要求安装提供身份验证API给Web应用程序的应用程序,而不是存储本地设备令牌。这个应用程序可以嵌入到计算机上很难被黑客攻击、删除或移动的位置。(以这种方式,该应用程序将为机器提供“双重认证”系统。)

  • 与上述想法共同或分别使用,您可以在设备上安装一个单独的“电话主页”应用程序。它会定期与您的服务器“签到”。如果更改了网络位置、设备配置或停止响应,则可以相应地拒绝访问。

希望这能有所帮助。我不认为自己是安全专家,但我喜欢思考设计问题。如果您在https://security.stackexchange.com/上提问,您可能会得到更好的回答。


我们将为“未识别”的机器或其声明失败的机器使用一次性密码。至于其他建议,正如我在问题中提到的,我必须实施“轻触”(意思是不需要额外的软件),否则我会选择那条路线。我的原始解决方案考虑到了“尽力而为”,因为正如你所说,我无法控制给定约束条件下的客户端,如果其他方法都失败了,我们会标记该账户并要求进行一次性密码验证。 - moribvndvs
然而,您提到需要检测系统何时已移动。我曾考虑过使用地理 IP API 记录用户的大概城市位置。在此基础上,也许可以利用客户端 IP 地址上的启发式方法来尝试检测奇怪的行为,在检测到异常情况时回退到 1TP 验证。对于真正的移动客户,我们可以要求 x509 认证或安装客户端软件。无论如何,感谢您花时间考虑这个问题。 - moribvndvs
很高兴能帮忙。我刚发现了另外两个相关的SO问题,可能会给你一些想法:唯一标识计算机设备指纹用于安全客户端访问网络 - David J.
@HackedByChinese 这个回答值得获得赏金吗?我承认我是因为悬赏而来寻找它的。 :) - David J.
是的,我认为你涵盖了这种情况的所有实际要点。 - moribvndvs

1

那么捕获计算机的MAC地址并将该信息存储在数据库中怎么样?正如您所知,MAC地址对于所有计算机都是唯一的,而不同于IP地址。

使用Java小程序在网页上获取MAC地址

在线上有几种通过网页和小程序捕获MAC地址的方法。


如果我要运行Java小程序,我会让它从操作系统中安全地代理私钥/公钥,然后从那里使用HMAC。使用Java小程序是一个有趣的想法,但它基本上属于“需要客户端软件”的类别。也许我会重新考虑这个想法。谢谢。 - moribvndvs

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