我一直想知道网站如何生成“与他人共享”链接。有些网站允许您通过链接共享一段数据,以使您发送链接的人能够看到或什至编辑数据。例如Google Drive,OneDrive等...,它们为您提供了一个(很短的)链接,但是,什么使我无法保证有人“靠运气”找到此链接并访问我的数据呢?就像如果攻击者正在尝试所有可能的链接那样:https://link.share.me/xxxxxxx
直到找到一些可行的链接,该怎么办?
非常感谢你。
也许最重要的事情(除了熵,我们将在一秒钟之内再谈)是从中获得随机数的地方。为此,您应该使用加密的伪随机数生成器(crypto prng)。(作为附带说明,您也可以使用真正的随机数,但是真正的随机数来源很难获得,如果生成许多链接,则可能会耗尽可用的随机位,因此加密prng可能对您足够了目的,很少有应用程序确实需要真正的随机数)。大多数语言和/或框架都为此提供了便利,例如在Ruby中SecureRandom
,在Java中java.security.SecureRandom
,例如在python中os.urandom
,等等。
好吧,应该多久。这在某种程度上也取决于您的其他非安全性要求,例如有时这些要求在电话中易于说出,易于键入或类似内容。除了这些,您应该考虑的是熵。您计算所有可能代码数的想法是一个很好的开始,我们可以说代码中的熵是该数字的log2(以2为底的对数)。因此,对于区分大小写,长度为10个字符的字母数字代码,熵为log2((26 + 26 + 10)^ 10)= 59.5位。您可以以相同的方式计算任何其他长度和字符集的熵。
这可能就足够了,您应该考虑的是攻击者。他们是否只能执行在线攻击(速度要慢得多),也可以离线执行(可能非常快,特别是使用专用硬件)?另外,如果他们找到一个,例如财务数据,只是一张随机的有趣图片或某人的个人数据,这会对您产生多大的影响,您在多个司法管辖区对此负有法律责任(请参阅欧盟的GDPR或加利福尼亚州的隐私法) )?
通常,您可以说64位熵对于许多用途而言可能已经足够好,而128位熵就足够了(也许对于加密密钥和非常高安全性的应用除外)。对于安全性较低的应用,上面的59位几乎是64位,例如,这可能是合理的折衷方案,以提高可用性。
简而言之,没有确定的答案,这取决于您要对此建模的方式以及要满足的安全要求。
还有两件事要考虑:这些代码的有效性以及将要发出的代码数(空间的密度)。
我认为这里常用的变量是代码的字符集及其长度。有效性更像是业务需求,并且代码的密度将取决于您的用法以及长度(它定义了代码空间的大小)。
例如,假设您有64位熵,您已经发出了1000万个密码,并且攻击者只能通过以100 /秒的速度向服务器发送请求来执行在线攻击。这些可能会向安全方面夸大其词。
这意味着某人一年内有0.17%的机会可以找到有效的代码。但是,您的攻击者是否会花费大量精力来查找一个(随机)有效代码?您是否可以接受,仅取决于您的具体情况,只有您能知道。如果没有,您可以增加例如代码的长度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句