9

我有一个 Web 应用程序,我的任务是添加安全登录以增强安全性,类似于 Google 添加到 Google 帐户的内容。

用例

本质上,当用户登录时,我们想要检测用户之前是否授权过这台计算机。如果计算机未获得授权,则向用户发送一个一次性密码(通过电子邮件、SMS 或电话),他们必须输入该密码,用户可以选择记住这台计算机。在 Web 应用程序中,我们将跟踪授权设备,允许用户查看他们上次从该设备登录的时间/地点,并根据他们的选择取消对任何设备的授权。

我们需要一个非常轻量级的解决方案(也就是说,不需要安装客户端软件),并且适用于 Safari、Chrome、Firefox 和 IE 7+(不幸的是)。我们将提供 x509 安全性,它提供了足够的安全性,但我们仍然需要为不能或不会使用 x509 的客户提供解决方案。

我的意图是使用 cookie 存储授权信息(或者,可能使用本地存储,降级为 flash cookie,然后是普通 cookie)。

一开始脸红

初始安全登录序列图 跟踪两个单独的值(本地数据或 cookie):表示安全登录令牌的哈希值和设备令牌。这两个值都由 Web 应用程序驱动(和记录),并指示给客户端。SSO 令牌取决于设备以及序列号。这有效地允许设备被取消授权(所有 SSO 令牌都变得无效)并通过使用序列号和使用随机数来减轻重放(虽然不是有效的,这就是我问这个问题的原因)。

问题

使用此解决方案,某人可以只复制 SSO 和设备令牌并在另一个请求中使用。虽然序列号将帮助我检测此类滥用并因此取消对设备的授权,但检测和响应只能在有效设备和恶意请求都尝试访问之后发生,这是造成损害的充​​足时间。

我觉得使用 HMAC 会更好。跟踪设备、序列,使用私钥创建随机数、时间戳和散列,然后将散列和这些值作为纯文本发送。服务器做同样的事情(除了验证设备和序列)并进行比较。这似乎更容易,也更可靠......假设我们可以安全地协商、交换和存储私钥。

问题

那么,如何安全地为授权设备协商私钥,然后安全地存储该密钥?至少,如果我满足于使用本地存储或闪存 cookie 存储私钥并只是说它“足够好”,是否更有可能?或者,我可以对我的原始草案做些什么来减轻我描述的漏洞?

4

2 回答 2

5

我怀疑您要求的安全性超出了所描述的系统所能提供的安全性。简而言之,如果您无法控制客户端,它可以(错误)以无数(非预期)方式使用 SSO 和设备令牌,正如您所知。系统的其他部分设计得有多好并不重要。这是您系统的致命弱点。

换句话说,在您所描述的系统中,您正在分配并信任客户端的 Web 浏览器来提供其设备令牌和 SSO 令牌。对?如果是这样,您如何防止这些令牌移动到其他设备?(见下文缓解策略。)

现在,考虑到这一点,正面回答您的问题:

“那么,我怎样才能安全地协商授权设备的私钥,然后安全地存储该密钥?”

正如我上面解释的那样,这样做并没有什么坏处,但它不会有帮助。

“至少,如果我满足于使用本地存储或闪存 cookie 存储私钥并只是说它“足够好”,是否更有可能?

我不能告诉你什么是“足够好”。您应该清楚地传达“移动代币”攻击并帮助客户做出明智的决定。

“或者,我可以对我的原始草案做些什么来减轻我描述的漏洞吗?”

当然,有一些缓解策略取决于您的用户安装基础和您对风险的承受能力。

在我看来,关键问题是——想想可能将令牌从一台机器转移到另一台机器的人的技能和能力——你的缓解策略能否在不降低系统性能和可用性的情况下显着削弱这种行为“诚实”的用户?

这里有一些想法:

  • 您可以使用两因素身份验证,例如 RSA SecurID。这不会阻止机器令牌的移动,但需要 TFA 随之移动。

  • 您可以尝试混淆或隐藏这些令牌的本地副本,但这似乎只是通过默默无闻的安全性。

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

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

  • 如果您知道机器不应该在物理上移动,则可以检查网络属性以寻找机器位于不同网络位置的证据,从而寻找物理位置。

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

  • 您可能需要安装一个为 Web 应用程序提供身份验证 API 的应用程序,而不是存储本地设备令牌。该应用程序可以将自身嵌入计算机上难以破解、根除或移动的某个位置。(通过这种方式,该应用程序将为机器提供“双因素身份验证”系统。)

  • 与上述想法一致或独立于上述想法,您可以在设备上安装单独的“电话回家”应用程序。它会不时与您的服务器“签入”。如果它更改网络位置、设备配置或停止响应,您可以相应地拒绝访问。

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

于 2012-06-21T03:14:09.243 回答
1

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

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

在线查看有几种方法可以通过网页和小程序捕获 MAC 地址。

于 2012-06-21T16:10:50.453 回答