Security 离线进行用户身份验证的最佳模式是什么?

Security 离线进行用户身份验证的最佳模式是什么?,security,authentication,hash,Security,Authentication,Hash,我正在将身份验证构建到客户机-服务器应用程序中,我收到的一些反馈是,我应该将哈希计算留给服务器(最初的实现是让客户机接收哈希,根据客户机输入的密码计算哈希,然后比较它们)。这似乎是有道理的,但我还有一个问题--如何认证离线用户 例如,如果我部署到没有互联网接入的移动设备上,处理身份验证的最安全方式是什么 在我看来,我必须允许客户端接收哈希+任何salt信息,或者使用单独的pin/密码并允许客户端接收该密码的哈希+salt 我喜欢后者,因为它似乎限制了攻击向量——如果移动设备受到破坏,那么整个系统

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

例如,如果我部署到没有互联网接入的移动设备上,处理身份验证的最安全方式是什么

在我看来,我必须允许客户端接收哈希+任何salt信息,或者使用单独的pin/密码并允许客户端接收该密码的哈希+salt

我喜欢后者,因为它似乎限制了攻击向量——如果移动设备受到破坏,那么整个系统的安全性(例如所有网络认证的部件)都保持完整。


我的最佳选择和考虑事项是什么?

我想这可能取决于您的问题域,但对于安全的应用程序,由于缺乏信任,无法在客户端进行授权。在一个简单的例子中,您说明了哈希计算和比较是在客户端完成的,要获得访问权限,需要做的只是挂接一个调试器,逐步遍历代码并找到进行比较的位置,并在返回之前替换堆栈上的一个值(例如)。恭喜你,你被黑客攻击了


我想知道更多关于您的特定应用程序在“脱机”模式下需要启用哪些操作的信息,以及在我考虑脱机启用部分功能之前,设备重新连接后您的对账计划

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

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

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

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

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

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

如果你只需要玩具安全,你建议在移动设备上存储正确的哈希值就足够了,不管你是对真实密码还是备用密码进行哈希,因为如果你使用正确的哈希值,他们需要几十亿年才能找到允许他们访问远程服务的密码冲突


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

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

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

  • 在联机时,客户端将发送当前用户的id(它可能类似于散列或唯一标识该用户的东西)

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

  • 客户端发送回使用其私钥解密的令牌

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

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


    在敏感数据的情况下,可以像我提到的那样通过加密进行保护,可以使用密码对用户进行身份验证,也可以使用数据本身进行加密,以防设备丢失,不会受到危害。

    您是在说永久脱机访问,还是在对在线用户进行身份验证,现在它们不再是了?最终目标是让客户端稍后连接到服务器并同步其数据/更新。很抱歉造成混淆。我不是指所有用户共享的“主”密码,而是指保护用户的移动数据库和用户的服务身份验证凭据的密码。这有效地验证了离线和在线用户的身份。因此,您确认它不能完全是s