脱机进行用户身份验证的最佳模式是什么?

pc1*_*ter 5 security authentication hash

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

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

我看到它的方式,我将不得不要么允许客户端接收的哈希+盐的任何信息,或使用一个单独的PIN /密码,并允许客户端接收的哈希+盐的那个密码.

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

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

eri*_*son 2

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

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

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

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

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

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

如果您只需要玩具安全性,那么您在移动设备上存储正确的哈希值的建议就足够了,并且您是否对真实密码或备用密码进行哈希值并不重要,因为如果您使用正确的哈希值,那么它应该采取它们数十亿年的时间才找到允许他们访问远程服务的密码冲突。

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