使用 6 个字母的令牌访问文档

信息安全 密码 Web应用程序 访问控制
2021-08-11 07:13:22

我们正在构建一个 Web 应用程序,用户可以在其中将 6 个字母/数字(A_Z,0-9)插入表单以访问文档。每个文档都有一个随机分配的访问代码,如下所示:1ABH5F。

当用户插入有效代码时,将显示文档。没有用户登录(没有身份验证) - 它对公众开放。

前端将通过无状态 API 访问文档 - 代码将发送到 API,API 将返回文档。

我们应该如何实施信息安全?这里没有人是安全专家,但我们是这样想的:

  1. 在前端使用验证码
  2. 限制单个 IP 调用 API 超过 3 次/小时

我们还必须实施哪些其他措施来防止对文档的访问?

我想为这个系统指定用例是非常重要的:

这是一个供任何持有此文件的人查看原始(数字)文件的系统。它将用于用户可以打印文件(例如:汽车经销商)并将其带到其他公司(例如:汽车登记处)的环境中。

这里的问题是,用户可以(并且做!)伪造打印的文件,然后将它们带到其他公司(汽车登记处)。这些其他公司必须有办法检查原件是否与印刷版相同。

由于我们不知道其他公司是哪些(10000 多个汽车登记处中的任何一个),任何持有/查看 6 字母令牌的人都可以访问原始文件。

3个回答

蛮力

所以你有一个大小为 36 和 6 个字符的字母表。这为您提供了大约 20 亿种不同的代币。假设您有一千个不同的文档。这使您有两百万分之一的机会猜测与文档关联的令牌。一年中每小时尝试从一千个不同的 IP:s 会给你近一千万的猜测——这应该会给你几个文件。

当然,验证码让这变得更难了。但它们并不完美,它们总是可以被人类破解。

这里的问题是,由于您只输入令牌而没有文档 ID,因此您只能对 IP 进行速率限制,而不能对文档进行速率限制。这使得很难防止暴力破解,除非你有很大的空间可以从中挑选令牌。

分享

密码是个人密码,建议您不要共享它。这意味着如果它受到损害,可以轻松更改它,并且您可以控制谁得到它。

像这样的文档令牌应该是按设计共享的。你几乎无法控制谁得到它。它将最终出现在邮件服务器和备份上,并将其发布在世界各地的人们的桌面上。

您不知道谁可以访问令牌,如果您需要更改它,您需要将其重新分配给所有应该拥有它的人。这既不安全也不实用。

结论:一定有更好的方法

这不会给你很好的安全性。如果您要保护的资源不是很重要,它可能就足够了,但我不会将它用于任何有价值的事情。

我不知道您的确切用例,但无论如何,必须有比滚动您自己的 API 更好的方法来解决这个问题。使用现有的解决方案还可以避免您必须编写自己的代码的问题。

使用现有的云存储服务、与公司 Intranet 的 VPN 连接或其他方式。只是不要启动你的 IDE 并开始编码。

更新:您的用例

这是访问令牌可能是个好主意的情况之一。但要解决上述问题,我会这样做:

  • 保留 CAPTCHA 和 IP 速率限制。(您可能需要重新考虑如何进行速率限制,以防止意外或故意的 DOS。)
  • 为了处理暴力破解,我会增加令牌的大小。Google Drive 使用 49 个字符,包括大写字母、小写字母和数字。这对你来说也应该足够了。
  • 要解决共享问题,请在文档本身的二维码中打印带有令牌的 URL。这将漏洞问题带入了人们习惯处理的物理论文领域。看到论文的人将可以访问数字原件。这很容易掌握。
  • 考虑设置可以访问文档的次数限制,或者至少设置令牌可以使用多长时间的最长时间。如果汽车应该在一周内注册,则令牌没有理由在两周后工作。
  • 不要将令牌以纯文本形式存储在数据库中。哈希它们。(像 SHA256 这样快速的东西在这里应该足够了——当你有大的随机令牌时,不需要推出 bcrypt。)
  • 使用CSPRNG生成令牌,否则可能会被有权访问一些令牌的攻击者猜到。

既然您说“任何持有查看 6 个字母令牌的人都可以访问原始文档”,我认为这些中没有什么真正的秘密(即,我不能通过简单地在邻居的垃圾箱中找到一个令牌来进行欺诈)。否则,请选择带有电子邮件注册和密码的常规身份验证方案。

许多基于令牌的系统都以您描述的方式使用,尽管在您的情况下令牌长度非常小。我建议您至少使用两倍的令牌:这将使暴力攻击变得不切实际,而不会使系统更难使用。

PS。哦,如果您还没有,请从您的字母表中排除字母 O 和 I。

限制单个 IP 调用 API 超过 3 次/小时

首先,这是一个巨大的拒绝服务风险。仅仅因为有人混淆了“l”和“1”而被锁定一个小时是不可接受的。

请记住,几乎所有办公计算机都在 NAT44 之后。每个 IP 后面都有几个用户。使用CGNAT (NAT444)和 NAT464,您还会看到不同建筑物中的许多家庭用户使用相同的 IP。