关于野外攻击哈希的故事

发布者:上海IT外包来源:http://www.lanmon.net点击数:1377

有一天,你和你的邻居同时开了一个快递站,但你的运气很好,每天有很多快递员来找你,生意兴隆,然而,你的邻居生意非常冷清。
有很多快递,为了方便快捷找到快递,所以你可以根据快递手机号码的最后两位数对快递员进行分类。例如,尾号为01并放置在机柜1中,尾号为机柜2的02。如果有人来接快递,他只需要报告他的手机号码,他就可以快速找到相应的柜子,然后根据完整的手机号码在这个柜子里找到相应的快递员。
衷心恶意的邻居
随着岁月的流逝,你的店铺越来越火。然而,你的邻居的生意很冷,你在厕所哭,但你没有关注你的邻居,也没有与他分享任何生意。所以,你的邻居我很糟糕,我决定和你订婚。
他知道你被快递电话号码的最后两位数分类,因此他批量购买了很多非常便宜的物品,并制作了最后两个手机号码中的两个。
所以,你收到了很多快递,大量的快递被分配到同一个柜子里,导致很多快递邮件堆积在一些柜子里,所以很拥挤,他们不得不把一些地下,但有些柜子是空。的。
这不仅会导致资源分配不均匀,而且每次客户来取货时都需要很长时间才能找到。
所以你父亲对你说:你想增加内阁的容量吗?
你:增加容量是没用的。虽然它不能在短时间内挤在地下排出,但基本问题仍未解决。
替换策略
为了解决这个问题,您采取了另一种策略,将手机号码作为值,然后对此值进行平衡,例如电话号码%99=机柜号码。
每次来宾时,您都会拿走他的手机号码,然后告诉他去相应的柜子。如果你遇到麻烦,操作比以前更大,但是你正在避开你。邻居攻击也是值得的。
问题的本质
然而,美好时光并不长。您的邻居观察并测试并发现您通过手机号码映射到相应的机柜。因此,它找到了一堆具有相同手机号码和相同手机号码的手机号码。所以,你又跑了。
你知道你的侄子是计算机专业,所以你告诉你的侄子。当你的侄子听到这个消息时,它变得强大起来,所以我忍不住吹了下面的一堆:告诉您,您的映射策略等同于我通常学习的哈希算法。无论您如何更改算法策略,只要其他人知道您的哈希算法,它就容易受到其他人的攻击。邻居的攻击方法称为哈希攻击。
我们都知道,在各种数据结构中,存在平均时间复杂度和最差时间复杂度。对于哈希算法,如果我们将n个元素插入到数组中,则平均时间复杂度为O(n)。最差的时间复杂度是O(n ^ 2);查找元素的平均复杂度为O(1),最差时间复杂度为O(n),哈希攻击是攻击者的意图。给出一些特殊值,以便我们每次都遇到最糟糕的时间复杂度。
如何防守?
正如我之前所说,哈希攻击的本质是攻击者掌握了你的哈希算法。那你怎么想保卫呢?我们需要设计一个优秀的哈希算法。什么是优秀的哈希算法?
1.映射的哈希码均匀分布。
2,不易破裂。
当然,无论你如何设计,一旦攻击者掌握了算法的细节,你就必须冷静下来。
有没有更好的防守?
实际上,我们可以通过生成一些随机值来增强哈希算法。例如,每次我们创建哈希表时,我们会随机生成一个新的随机值作为哈希算法的一部分。这样,即使是相同的内容,在不同的表中也会产生完全不同的哈希码。
通过这种方式,攻击者很难做出预测。即使发生碰撞,也只是一个小概率的巧合,而不是攻击者主动控制。我们还将此随机值称为散列种子。这种使用散列种子的散列算法,我们称之为Keyed Hash函数。
当然,上述方法只是防御野外攻击的一种方法。对于哈希冲突,访问中最常问到的应该是Java中的哈希表。我将告诉你如何在Java8中解决它。哈希碰撞。
如果Java中的哈希表中存在哈希冲突,则链表将用于存储具有相同哈希码的元素,但如果大量哈希码相同,则会放入大量元素。相同的链表。这将导致哈希表的查找时间复杂度为O(n)。为了解决这个问题,当链表中的元素大于或等于8时,使用红色和黑色树而不是链表,以便最大时间复杂度的差异控制在O(logn)。
结束
你的侄子已经炸毁了很多专业名词。对于那些只读小学的人来说,很难想到这一点。这时,你不能再忍受了。我会为你抛出一句话:你能说点什么吗?你需要告诉我,我该怎么办?你的侄子:让我来为你设计一个程序。您只需将手机号码放入其中,它就会自动将您映射到相应的机柜。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部