5

我正在将身份验证构建到客户端-服务器应用程序中,我收到的一些反馈是我应该将哈希计算留给服务器(最初实现它是为了让客户端接收哈希,从客户端的输入密码,然后比较它们)。这似乎是有道理的,但我有一个问题 -我如何验证离线用户

例如,如果我部署到无法访问 Internet 的移动设备,那么处理身份验证的最安全方法是什么?

我看到它的方式,我将不得不允许客户端接收哈希+任何盐信息,或者使用单独的密码/密码并允许客户端接收该密码的哈希+

我倾向于后者,因为它似乎限制了攻击媒介——如果移动设备受到威胁,那么整个系统的安全性(例如,所有网络认证的部分)都会保持不变。

我最好的选择和考虑是什么?

4

3 回答 3

2

如果您更详细地解释您的应用程序,我可能会发现我在这里不合适,但现在我将对您的用例和威胁模型做出一些假设。

我的理解是,您有一些敏感信息要在具有间歇性连接的移动设备和一些远程服务之间同步。该服务只有经过身份验证的用户才能访问,并且用户必须向移动设备验证自己的身份才能访问其信息副本,即使它处于脱机状态。

如果您想要强大的安全性,请使用基于密码的加密来加密移动设备的副本。

您可以使用用于对服务进行身份验证的相同密码,但总的来说,我会避免将相同的密钥用于不同的目的。更好的方法是为移动设备设置一个主加密密码,该密码对移动数据库以及用于向同步服务验证用户身份的“密码”进行加密。请注意,服务身份验证密码实际上可以是 SSL 客户端证书身份验证的私钥或基于字符的密码。

您必须评估只有一个密码的风险,但在许多情况下,我认为这为用户提供了便利,再加上一个强主密码提供的安全性,而不是两个弱但容易记住的密码是一个很好的平衡。

请注意,此方法将允许服务访问权限已被撤销的用户继续访问其本地副本,但没有任何新的更新。您可以包含一些由移动软件强制执行的时间限制的概念,但坚定的攻击者可以规避这一点。

如果您只需要玩具安全性,那么您在移动设备上存储正确哈希的建议就足够了,无论您对真实密码还是替代密码进行哈希处理都无关紧要,因为如果您使用正确的哈希,它应该采用它们数十亿年才能找到允许他们访问远程服务的密码冲突。

但是,假设攻击者可以看到密码哈希,是什么阻止他们查看同步数据呢?为什么他们需要恢复密码?加密移动数据库可以防止这种情况发生。

于 2008-10-21T18:06:35.600 回答
1

我想这可能取决于您的问题域,但是对于安全的应用程序,由于缺乏信任,无法在客户端完成授权。在您说明在客户端完成哈希计算和比较的简单情况下,要获得访问权限,某人所要做的就是挂钩调试器,单步执行代码并找到完成比较的位置,然后将值替换为返回之前的堆栈(例如)。恭喜你,你被黑了。

我想了解更多关于您的特定应用程序在“离线”模式下想要启用哪些操作的信息,以及在我考虑启用部分功能离线之前重新连接设备后您的协调计划是什么。

于 2008-10-20T22:49:54.580 回答
0

几分钟前我发布了一个类似的问题,经过更多思考,我可能找到了一种可以接受的方法,使用公钥/私钥。以下是我为我的应用概述的步骤:

  1. 当用户离线时,他可以选择使用密码来保护离线时对应用程序的访问(可选加密以防止被盗)。

  2. 上线后,客户端将为当前用户发送一个 id(它可能像一个哈希或唯一标识该用户的东西)。

  3. 服务器发送使用该用户的公钥加密的授权令牌。

  4. 客户端发回用他的私钥解密的令牌。

  5. 服务器最终发送一个会话令牌以继续进一步通信(这最后一步可能是不必要的,也许可以使用已经建立的身份验证令牌?)。

我不是加密或安全方面的专家,但在我看来,这种方法非常安全,因为我能想到的入侵服务器的唯一方法是让攻击者拥有用户的私钥及其通行证短语。

在敏感数据的情况下,这可以通过加密来保护,正如我提到的那样,通过密码来验证用户身份,或者对数据本身进行加密,这样万一设备丢失,它就不会受到损害。

于 2008-10-24T22:02:07.420 回答