蛮力
所以你有一个大小为 36 和 6 个字符的字母表。这为您提供了大约 20 亿种不同的代币。假设您有一千个不同的文档。这使您有两百万分之一的机会猜测与文档关联的令牌。一年中每小时尝试从一千个不同的 IP:s 会给你近一千万的猜测——这应该会给你几个文件。
当然,验证码让这变得更难了。但它们并不完美,它们总是可以被人类破解。
这里的问题是,由于您只输入令牌而没有文档 ID,因此您只能对 IP 进行速率限制,而不能对文档进行速率限制。这使得很难防止暴力破解,除非你有很大的空间可以从中挑选令牌。
分享
密码是个人密码,建议您不要共享它。这意味着如果它受到损害,可以轻松更改它,并且您可以控制谁得到它。
像这样的文档令牌应该是按设计共享的。你几乎无法控制谁得到它。它将最终出现在邮件服务器和备份上,并将其发布在世界各地的人们的桌面上。
您不知道谁可以访问令牌,如果您需要更改它,您需要将其重新分配给所有应该拥有它的人。这既不安全也不实用。
结论:一定有更好的方法
这不会给你很好的安全性。如果您要保护的资源不是很重要,它可能就足够了,但我不会将它用于任何有价值的事情。
我不知道您的确切用例,但无论如何,必须有比滚动您自己的 API 更好的方法来解决这个问题。使用现有的解决方案还可以避免您必须编写自己的代码的问题。
使用现有的云存储服务、与公司 Intranet 的 VPN 连接或其他方式。只是不要启动你的 IDE 并开始编码。
更新:您的用例
这是访问令牌可能是个好主意的情况之一。但要解决上述问题,我会这样做:
- 保留 CAPTCHA 和 IP 速率限制。(您可能需要重新考虑如何进行速率限制,以防止意外或故意的 DOS。)
- 为了处理暴力破解,我会增加令牌的大小。Google Drive 使用 49 个字符,包括大写字母、小写字母和数字。这对你来说也应该足够了。
- 要解决共享问题,请在文档本身的二维码中打印带有令牌的 URL。这将漏洞问题带入了人们习惯处理的物理论文领域。看到论文的人将可以访问数字原件。这很容易掌握。
- 考虑设置可以访问文档的次数限制,或者至少设置令牌可以使用多长时间的最长时间。如果汽车应该在一周内注册,则令牌没有理由在两周后工作。
- 不要将令牌以纯文本形式存储在数据库中。哈希它们。(像 SHA256 这样快速的东西在这里应该足够了——当你有大的随机令牌时,不需要推出 bcrypt。)
- 使用CSPRNG生成令牌,否则可能会被有权访问一些令牌的攻击者猜到。