使用户身份验证脱机的最佳模型是什么



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

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

在我看来,我必须允许客户端接收哈希+

任何盐信息,或者使用单独的pin/密码并允许客户端接收密码的哈希+盐

我赞成后者,因为它似乎限制了攻击媒介 - 如果移动设备受到损害,那么整个系统(例如所有经过网络身份验证的部分)的安全性保持不变。

我的最佳选择和考虑因素是什么?

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

我的理解是,您有一些敏感信息,您希望在具有间歇性连接的移动设备和某些远程服务之间同步。该服务仅供经过身份验证的用户访问,用户必须向移动设备进行身份验证才能访问其信息副本,即使它处于脱机状态也是如此。

如果需要强大的安全性,请使用基于密码的加密对移动设备的副本进行加密。

您可以使用用于对

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

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

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

如果您

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

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

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

我想知道有关您的特定应用在"离线"模式下想要启用哪些操作的更多信息,以及在重新连接设备后您的协调计划,然后再考虑离线启用部分功能。

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

  1. 当用户脱机时,他可以选择使用密码在脱机时保护对应用的访问(使用可选加密以防止被盗)。

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

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

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

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

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

对于敏感数据,这可以通过我提到的加密来保护,通过密码只是为了验证用户,或者使用数据本身加密,以防设备丢失,它不会受到损害。

最新更新