(转载)
在去年(其实只是半个月前而已),Tomcat就紧急发布安全漏洞通知,同时微软也发布了相应的安全漏洞通知,他们都是通过变通的方式来解决此拒绝服务漏洞。而在这风口浪的碰撞拒绝服务漏洞是什么呢?
1.什么是HashTable 碰撞?
我觉得有必要先阐述一下什么是HashTable碰撞,因为这个拒绝服务漏洞不是因为服务器的编码原因或是疏忽造成的,而是程序语言自身的问题,此问题除了perl,ruby外,几乎无一幸免,可怜的JAVA当然也在其中了.
HashTable是原意是将所有数据能足够散列的以键值对的形式存在,这样能极大的提高读取效率又能有一定的安全性,哪怕被截了包也不会轻易的让人读出数据。
在java中:
Hashtable<String,String> hashTable = new Hashtable<String,String>();
hashTable.put("test123", "123");
上面的代码,展示了JAVA如何进行HASH键值的存储,其中dreamforce是key,me代表value,这个key在放入hashtable时,会进行hash加密转换成hash码,但是知道HASH加密算法的都知道,hash密文和hash明文绝对会存在一对多的关系,也就是说现实生活中一定会有几条数据hash加密后产生的hash值是一样的,这是必然的结果。那么hash就从此不再安全了吗?其实不然,只是说这种必然的概率相当的小,同时我们在进行hash算法的时候也一定要会使这种必然事件的概率降到最低,这才是一个极好的hash加密算法.
那么一旦这种必然条件触发后,就会引起了所谓的碰撞:
这种碰撞的出现要满足两个条件,key的真实值必须要不同,因为相同的key值会被hash表给过滤掉,其二就是key值的hashcode一定要一样,举例说明:
在JAVA中,Aa 和 BB这两个值的hashcode是一样的,都是2112, 有兴趣的同学可以试试
那么如果我进下以下的编码,大家会看到一个很诡异的事情:
Hashtable<String,String> hashTable = new Hashtable<String,String>();
hashTable.put("test123", "123");
hashTable.put("Aa", "456");
hashTable.put("BB", "789");
通过调试,你们可以看到不一样的地方:
在上图中,你们可以看到 table中,只有两条记录存在 (BB=789, test123=123),按道理来说,应该是三条,那么有一条记录(Aa=456)去了哪里了?
通过上图,大家应该恍然大悟了,那一条记录并没有消失,而是变成了链表结构追加到了key=BB 这条记录的下一个节点之上。。这样就打破了hashtable的结构,如果有N条这样的碰撞出现,那么hashTable的效率也将荡然无存了.数据就成了链表结构,而这时要获取一个在链表之上的节点的value,就会进行N次迭代进行获取,那么算法效率就从o(1)变成了o(n)……..
2.拒绝服务式攻击
接着上面阐述了hashTable的碰撞原理后,各位同学们也应该了解了这个拒绝服务式攻击了吧,其实就是因为这个hashTable的漏洞的存在,如果有人通过传递精心设计好的可以产生碰撞的超大数据,那么就会导致服务器不断的进行迭代读取,CPU一下子就会被全额占满,这是相当恐怖的。有数据说,10kb的数据量就会导致一个i7的CPU马上占用率飙升100%,本人没有试过,但也相信应该差不多..
3.如何是好?
关于tomcat 以及微软的解决之道就是很变通的告知大家,将请求参数据缓存值设小,也就是说,一次性的请求量不会导致CPU被全部占满。。。其实这也是无奈之举。
除此之外,就是设计好HASH算法,一定要保证必然碰撞事件的概率降低,也就是说提高生产位数,带来的痛苦就是请求效率降低。各有取舍吧,鱼与熊掌不可兼得.
做好异常检测,不要来者不拒,还是要理性的区分正常与恶意的数据请求.
==========================================
另外我验证以上说法的时候,碰到一个问题:
Hashtable<String,String> hashTable = new Hashtable<String,String>();
hashTable.put("test", "123");
hashTable.put("Aa", "456");
hashTable.put("BB", "789");
在JAVA中,Aa和BB的hashcode是一样的,都是2112,而test的hashcode是3556498。奇怪的现象发生了。(由于不懂原理,只能称之为“奇怪现象”)如下图:
在上图中,hashtable中只有一条记录(BB=789),test的记录到哪里去了呢。请看下图:
为什么test会追加到Aa后面呢?他们的hashcode又不相同?
- 大小: 39.5 KB
- 大小: 36 KB
- 大小: 26.8 KB
- 大小: 42.2 KB
分享到:
相关推荐
总之,C#中将JSON字符串转换为`Hashtable`以及反之的过程涉及到了JSON序列化和反序列化的概念,这在开发与Web服务交互的应用程序时尤其重要。虽然`Hashtable`在现代.NET应用中已经较少使用,但了解如何在JSON和`...
哈希表(Hashtable)是.NET框架中的一种常用数据结构,主要用作键值对存储,它提供了快速的数据存取方式。在WinForm应用程序中,我们可能会利用Hashtable来管理各种对象,尤其是在需要高效查找和操作数据时。下面将...
《深入解析HashTable:C语言实现的精髓》 在计算机科学中,哈希表(HashTable)是一种数据结构,它实现了关联数组的抽象数据类型,能够快速地进行查找、插入和删除操作。哈希表通过将键(Key)映射到表中的一个位置...
在ASP.NET中,Hashtable是一种常用的数据结构,它是一个键值对集合,允许程序员存储和检索对象。本篇文章将深入探讨如何在ASP.NET中遍历Hashtable,以及相关的重要知识点。 首先,理解Hashtable的基本概念至关重要...
在Java编程语言中,`Hashtable`是一个非常基础且重要的数据结构,它属于集合框架的一部分,提供了键值对(key-value pairs)的存储功能。`Hashtable`类是线程安全的,意味着在多线程环境下,它能确保数据的一致性和...
### HashMap与HashTable的区别详解 #### 引言 在Java编程中,`HashMap`与`HashTable`作为两种常用的数据结构,经常被用来存储键值对数据。尽管它们在功能上相似,但在实现细节、性能表现以及使用场景方面存在显著...
### hashMap和hashTable的区别 #### 一、简介与基本概念 `HashMap` 和 `HashTable` 都是 Java 集合框架中非常重要的数据结构,它们都实现了 `Map` 接口,用于存储键值对。尽管它们在功能上有很多相似之处,但在...
Hashtable是C#编程语言中的一种内置数据结构,属于.NET Framework的System.Collections命名空间。它是一个基于散列的键值对集合,允许程序员快速查找、添加和删除元素。在本篇文档中,我们将深入探讨如何在C#中有效...
### HashMap与HashTable的区别 在Java编程语言中,`HashMap`和`HashTable`是两种非常重要的数据结构,它们都实现了`Map`接口,并提供了键值对的存储方式。这两种数据结构虽然相似,但在实现细节和使用场景上存在...
HashMap和HashTable底层原理以及常见面试题 HashMap和HashTable是Java中两个常用的数据结构,都是基于哈希表实现的,但它们之间存在着一些关键的区别。本文将深入探讨HashMap和HashTable的底层原理,并总结常见的...
### Hashtable和HashMap的区别 在Java编程语言中,`Hashtable`和`HashMap`是两种非常重要的数据结构,它们都实现了`Map`接口,用于存储键值对。尽管它们有着相似的功能,但在实现细节和应用场景上存在显著差异。接...
- 如果 HashTable 的碰撞处理不当,效率会大大降低。 - 不适用于大数据排序场景。 #### 五、应用场景 HashTable Sort 最适合应用于以下几种情况: - 数据集较小。 - 内存足够大。 - 排序操作不是非常频繁。 ...
### HashMap与Hashtable的区别 在Java编程语言中,`HashMap`和`Hashtable`是两种非常重要的数据结构,它们都用于存储键值对。然而,在实际应用过程中,这两种数据结构有着本质的不同,下面将详细介绍这些差异。 ##...
在Java编程语言中,`Hashtable`是`Collections`框架的一部分,它是一个同步的键值对存储容器。在早期的Java版本中,`Hashtable`并没有直接支持泛型,这意味着你可以在其中存储任何类型的键(`Object`)和值(`Object...
本教程将详细讲解如何使用Java中的Session和Hashtable来实现这一功能。 首先,Session是Web应用程序中用于跟踪用户状态的一种机制。在HTTP协议无状态的特性下,Session为我们提供了在多个请求之间保持用户信息的...
**Hashtable的使用** 在Java编程语言中,`Hashtable`是一个基于键值对(key-value pairs)的数据结构,它属于同步的、线程安全的容器类。`Hashtable`是`Dictionary`类的一个子类,它不支持`null`键或`null`值。这个...
### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...
在本篇文章中,我们将深入探讨哈希表的实现,特别是基于C语言的简单实现,参考文件"hashtable.c"和"hashtable.h"。 1. 哈希函数:哈希表的核心是哈希函数,它将输入(键或关键字)转换为数组索引。一个好的哈希函数...
在Java编程语言中,哈希表(HashTable)是一种常见的数据结构,它提供了高效的数据存储和检索功能。哈希表基于哈希函数将键(Key)映射到数组的索引位置,通过键值对(Key-Value Pair)来存储数据。这种数据结构允许...
**C# .NET HashTable 知识点详解** 在C# .NET编程环境中,`HashTable`类是一个非同步、无序的键值对集合,它提供了快速的数据存储和检索功能。`HashTable`类是基于哈希表数据结构实现的,这使得它能够通过键(key)...