Web 应用程序的 URL 中的 Pin + guid 安全吗?

信息安全 验证
2021-09-05 16:16:52

我们有一个正在进行的项目,其中安全性是一个热门话题。整个站点是 SSL 并且提议的身份验证过程是这样的:

  1. 用户亲自收到一个非唯一的 4 位密码。
  2. 通过电子邮件向用户发送带有长(大约 40 个字符)GUID 的 URL。
  3. 用户访问 URL 并输入 pin 以进行身份​​验证。(销是盐渍/散列)
  4. 提示用户设置密码。(适当加盐、散列和存储)
  5. 通过 guid 链接访问该站点后,现在将提示他们输入电子邮件/密码而不是密码。他们还可以访问没有 GUID 的通用 URL 并使用 UN/Pass 登录

一位安全顾问告诉我们这还不够好(我目前不知道原因的细节)。对我来说似乎足够了。我们从一开始就没有设置密码,因为这将是不切实际的用户体验,我们从 PIN 更改为密码,以便用户可以使用没有 guid URL 的通用登录页面。

4个回答

使用 GUID 作为用户的唯一标识符而不是电子邮件地址对低功率攻击者有好处带有 GUID 的 URL 已通过电子邮件发送,因此不能将其视为真正机密。有动机的攻击者将监视网络线路并查看该电子邮件。然而,业余爱好者或自动攻击机器人虽然无法阅读其他人的电子邮件,但可能会“猜测”电子邮件地址,但不能“猜测”随机 GUID。

因此,GUID 只有在不可预测的情况下才与安全性有任何关系,然后它只会对不太强大的攻击者带来任何好处。使用 GUID 并没有什么坏处,但不要相信它真的增加了很多保护。您可能希望确保 GUID 是使用第 4 版算法生成的,即来自强 PRNG 的 122 位:虽然 GUID 的目标是唯一性,但您需要不可预测性,这是另一种野兽;版本 4 GUID 确保两者。


请记住,GUID 不是(真的)秘密,您的系统可以这样描述:有一个一次性注册密码,它是一个四位数的 PIN。注册后,使用普通用户选择的密码。

主要问题是四位数的 PIN 太容易猜到:攻击者平均只需要尝试 5000 次才能找到正确的密码。您可以通过在对给定 GUID 进行 3 次错误尝试后停用 PIN 码来缓解此问题;那是智能卡的模型,以您的服务器为卡。但是,这只会阻止进行在线暴力破解的攻击者

不幸的是,某些攻击者偶尔会瞥见服务器数据库的某些部分。例如,这是 SQL 注入攻击的常见结果。废弃的旧硬盘也是此类泄漏的典型来源。这就是为什么您设想不存储 PIN 码的密码,而只存储其散列版本的原因。

但是密码散列,即使做得正确,也只会减慢攻击者的速度。如果迭代计数设置得如此之高,以至于您的服务器需要整整十秒的时间来验证 PIN 码(而十秒对于等待的客户来说是非常长的时间),那么攻击者将“只”需要 50000 秒使用相同的硬件进行计算,以“尝试” 5000 个可能的 PIN 码。由于攻击者将投入几台多核 PC,他可能会在一两个小时内倒下。这不是很多。

我建议使用更长的 PIN 码,比如 8 位数字。


总而言之:即使是一次性注册页面,您的 GUID 也不够“保密”,无法容忍四位数的 PIN。使用 GUID 代替电子邮件地址有趣,并且您希望它尽可能谨慎(因此使用“v4”GUID),但即便如此,当验证系统不是篡改时,四位数字对于 PIN 是不够的 -耐智能卡。使用八位数(或更多)。由于用户只会输入一次 PIN 码,他可以容忍一个相当长的序列(微软可以让用户输入 25 个字母的激活密钥,所以我认为注册的 8 位数字要求不会太高)。

如果电子邮件被泄露,PIN 对暴力破解的能力非常弱,但是,这可以通过简单地在尝试 3 次后锁定来部分抵消。这使攻击者有 3,333 分之一的机会闯入。它仍然不是很好,但根据您需要的安全级别可能就足够了。我还会审核他们被锁定的频率,如果你开始看到它被锁定很多,我会改变它,因为它会表明有人在攻击你。

如果无论如何要使用更长的临时密码,那肯定是非常可取的,但锁定是一个最小的步骤,可以用来帮助使系统比现在更安全。(这假设 GUID 也以不可预测的方式生成。如果 GUID 是可预测的,那么锁定是不够的,因为可以对大量 GUID 进行攻击,并且攻击 3000 左右以获得成功是可行的,除非 GUID无法猜测。)

  1. 我发现一个 4 针号码有点短,当你也可以使用随机生成的字符串时,这将更难猜测。即使 40 字符的 guid 应该没问题(确保它正确生成并且不可预测)
  2. 40 char GUID 似乎足够长
  3. 对只能是 0000 到 9999 之间的数字的东西进行散列和加盐处理有点矫枉过正,因为即使使用适当的加盐处理也需要几分钟才能产生所有可能性。
  4. 看起来不错,确保使用 PBKDF2、bcrypt 或 scrypt 来加盐并存储密码
  5. 看起来挺好的

要使其更强大,您仍然可以做的一件事是添加两因素身份验证。然后,两因素身份验证也可以与初始密码配置结合使用。

您需要退后一步并考虑上下文。

“这够安全吗?” 是一个无益的问题。

“如果客户的生命储蓄受到威胁,这对银行来说足够安全吗?” 是个好问题。

你用这个系统保护什么?您希望在可用性和安全性之间取得怎样的平衡?如果这是一个高度安全的系统,那么要求用户跟踪十位数的 PIN 是有意义的。如果您要保护低价值帐户,那么 4 位数可能就可以了。

您将 4 位密码描述为非唯一的。你不应该真正关心唯一性,你应该关心可预测性和蛮力。使用强大的随机数生成器将有助于提高可预测性,使用更长的 PIN 并锁定将有助于暴力攻击。