分享Link代安全

Share Link Generation Security

我一直想知道网站如何生成“与他人分享”link。 某些网站允许您通过 link 共享一段数据,以便让您发送 link 的人能够查看数据甚至编辑数据。 例如 Google Drive、OneDrive 等...他们给你一个(很短的)link,但是什么保证我不可能有人找到这个 link “运气好“并访问我的数据? 就像如果攻击者正在尝试 links 的所有可能性:https://link.share.me/xxxxxxx 直到他找到一些可行的方法?

  1. 是否有一定的长度几乎可以保证没有人会以这种方式找到link?例如,如果一个站点生成 1000 links,如果端点由 10 次 [A-Za-z0-9] 字符组成(~8e17 种可能性),我们只是假设它足够安全?如果是,我们认为这种系统是安全的 link 和可能性之间的概率或比率是多少?
  2. 是否有某种密码学或数学方法来生成那些 link 以确保 link 不会被任何人找到?

非常感谢。

我不使用 OneDrive,但我可以从 Google Drive 说:

  1. link 并没有那么短。我刚数了一个,长度是32
  2. 除了安全性之外,他们可能还 link 避免 运行 组合失误,因为每天共享数以千计的云端硬盘文件。为了安全起见,Drive 允许您选择可以访问它的用户。如果您 select “所有人”,那么您应该确保任何人都可以看到 link 的内容。即使 link 不能“偶然”找到,仍然存在其他人从您的朋友那里获得 link 然后分享它或者他们被代理捕获的可能性。长 link 应该只是对其他安全措施的补充。

回答您的问题:

  1. 可以找到任何长度的链接,但较长的 links 将需要更多时间才能找到。如果您使用所有字母数字字符,可能 30 个就足够了,但正如我所说,它们不应该是您系统中唯一的安全措施。
  2. 随机、长、字符范围大就可以了

可能最重要的事情(除了熵,我们稍后会回过头来)是你从哪里获得随机数。为此,您应该使用加密伪随机数生成器 (crypto prng)。 (作为旁注,您也可以使用真正的随机数,但是很难获得真正的随机源,如果您生成许多链接,您可能 运行 可用的随机位,因此加密 prng 可能是足以满足您的目的,很少有应用程序确实需要真正的随机数)。大多数语言 and/or 框架都有这个功能,在 Ruby 中是 SecureRandom,在 Java 中是 java.security.SecureRandom 例如,在 python 中是可以是 os.urandom 等等。

好的,应该多长时间。这在某种程度上也取决于您的其他非安全要求,例如,有时这些需要在 phone 上易于说出、易于键入或类似的要求。除了这些,你应该考虑的是熵。您计算所有可能代码的数量的想法是一个很好的开始,假设代码中的熵是该数字的 log2(以 2 为底的对数)。因此,对于长度为 10 个字符的区分大小写的字母数字代码,熵为 log2((26+26+10)^10) = 59.5 位。您可以用相同的方式计算任何其他长度和字符集的熵。

这可能就足够了,你应该考虑的是你的攻击者。他们只能进行在线攻击(慢很多),还是也可以离线进行(可以非常非常快,尤其是使用专用硬件)?另外,如果他们找到了一个影响是什么,它是像财务数据,还是只是一张随机的有趣图片,或者某人的个人数据,您在多个司法管辖区对此负有法律责任(参见欧盟的 GDPR,或加利福尼亚州的隐私法)?

一般来说,您可以说 64 位的熵对于许多用途来说可能已经足够了,而 128 位的熵就很多了(除了加密密钥和非常高安全性的应用程序)。由于上面的 59 位是..好吧,几乎是 64 位,对于安全性较低的应用程序来说,这可能是为了更好的可用性而进行的合理权衡。

所以简而言之,没有明确的答案,这取决于你想如何建模,以及你想满足什么样的安全要求。

还有两件事需要考虑这些代码的有效性,以及将发布多少(space 的密度)。

我认为这里常用的变量是代码的字符集及其长度。有效性更像是一种业务需求,代码的密度将取决于您的使用情况以及长度(它定义了代码的大小space)。

举个例子,假设你有 64 位的熵,你已经发布了 1000 万个代码,你的攻击者只能通过向你的服务器发送请求来执行在线攻击,比如每秒 100 次。这些可能是对安全方面的巨大夸大。

这意味着有人在一年内找到有效代码的可能性为 0.17%。但是你的攻击者会花这么多精力来寻找一个单一的(随机的)有效代码吗?这对你来说是否可以接受只取决于你的具体情况,只有你自己知道。如果没有,你可以增加代码的长度,例如。