hash碰撞的概率推导(生日攻击生日问题)

article/2025/11/11 12:22:09

1.关于hash碰撞

哈希碰撞是指,两个不同的输入得到了相同的输出;

hash碰撞不可避免,hash算法是把一个无限输入的集合映射到一个有限的集合里,必然会发生碰撞;

2.碰撞概率的问题描述的其他形式

  • n个球,(可重复的)随机放入k个桶里,至少有两个球在同一个桶里的概率;

  • 给K个随机值,非负而且小于n,他们中至少有2个相等的概率;

3.碰撞概率的取决因素

hash碰撞的概率取决于两个因素(k, n 同上述)

  • hash的取值空间 k

  • hash的计算次数 n

4.hash碰撞概率的数学原型:生日问题

即: 一个班级需要有多少人,才能保证每个同学的生日都不一样?

结果:当一个班级有7人时,至少两人生日相同的概率在5%;

当一个班级有23人时,至少两人生日相同的概率就达到了50%;

当一个班级有50人时,至少两人生日相同的概率就达到了97%;

5.生日问题概率推导

要求一个班级n个人,至少两个人生日相同的概率 Pa

可以先求每个人生日都不同的概率 Pb

进而转换为:一个空的房间里,第一个人进去与其他人不同的概率(1-0);第二个人进入房间与其他人不同的概率(1- 1/365);第三个人进去与其他人不同的概率(1-2/365)… 以此类推,直到最后一个人进入房间与其他人不同的概率(1-n/365)

得:
P b ( n ) = ( 1 − 0 365 ) ⋅ ( 1 − 1 365 ) ⋅ ( 1 − 2 365 ) ⋅ ⋅ ⋅ ( 1 − n − 1 365 ) (1) Pb(n) = (1-\frac{0}{365})\cdot(1-\frac{1}{365})\cdot(1-\frac{2}{365})\cdot\cdot\cdot(1-\frac{n-1}{365})\tag{1} Pb(n)=(13650)(13651)(13652)(1365n1)(1)
进而:
P b ( n ) = ( 365 − 0 365 ) ⋅ ( 365 − 1 365 ) ⋅ ( 365 − 2 365 ) ⋅ ⋅ ⋅ ( 365 − ( n − 1 ) 365 ) (2) Pb(n) = (\frac{365-0}{365})\cdot(\frac{365-1}{365})\cdot(\frac{365-2}{365})\cdot\cdot\cdot(\frac{365-(n-1)}{365})\tag{2} Pb(n)=(3653650)(3653651)(3653652)(365365(n1))(2)
化简:
P b ( n ) = 365 ! 36 5 n ( 365 − n ) ! (3) Pb(n) = \frac{365!}{365^n(365-n)!}\tag{3} Pb(n)=365n(365n)!365!(3)
故至少两人生日概率相同Pa为:
P a ( n ) = 1 − P b ( n ) = 1 − 365 ! 36 5 n ( 365 − n ) ! (4) Pa(n) = 1-Pb(n) = 1-\frac{365!}{365^n(365-n)!}\tag{4} Pa(n)=1Pb(n)=1365n(365n)!365!(4)
(4)式即为所求的公式,但是这个公式不便于计算,x趋于0时,根据泰勒公式:
lim ⁡ x → 0 e x = 1 + x + 1 2 x 2 + 1 6 x 3 + 1 24 x 4 ⋅ ⋅ ⋅ (5) \lim_{x \to 0}e^x = 1+x+\frac{1}{2}x^2+\frac{1}{6}x^3+\frac{1}{24}x^4\cdot\cdot\cdot\tag{5} x0limex=1+x+21x2+61x3+241x4(5)

近似的有:
e x ≈ 1 + x (6) e^x \approx 1+x\tag{6} ex1+x(6)

观察(1)式,用(6)式代入得:
P b ( n ) ≈ ( e − 0 365 ) ⋅ ( e − 1 365 ) ⋅ ( e − 2 365 ) ⋅ ⋅ ⋅ ( e − n − 1 365 ) (7) Pb(n) \approx (e^{-\frac{0}{365}})\cdot(e^{-\frac{1}{365}})\cdot(e^{-\frac{2}{365}})\cdot\cdot\cdot(e^{-\frac{n-1}{365}})\tag{7} Pb(n)(e3650)(e3651)(e3652)(e365n1)(7)
化简:
P b ( n ) ≈ e − n ( n − 1 ) 2 ⋅ 365 (8) Pb(n) \approx e^{-\frac{n(n-1)}{2\cdot365}}\tag{8} Pb(n)e2365n(n1)(8)
故:
P a ( n ) ≈ 1 − e − n ( n − 1 ) 2 ⋅ 365 (9) Pa(n) \approx 1 - e^{-\frac{n(n-1)}{2\cdot365}}\tag{9} Pa(n)1e2365n(n1)(9)

6.hash碰撞概率推导

要求给K个随机值,非负而且小于n,他们中至少有2个相等的概率 Pa

由上述推导不难看出:
P a ( k , n ) = 1 − k ! k n ( k − n ) ! (10) Pa(k,n) = 1-\frac{k!}{k^n(k-n)!}\tag{10} Pa(k,n)=1kn(kn)!k!(10)
且由泰勒展开式,近似得:
P a ( k , n ) ≈ 1 − e − n ( n − 1 ) 2 ⋅ k (11) Pa(k,n) \approx 1 - e^{-\frac{n(n-1)}{2\cdot k}}\tag{11} Pa(k,n)1e2kn(n1)(11)

7.python作图

在生日概率问题中,k365,做概率 Pa 关于班级人数n的函数图像:

准确表达式图像(4)式 (acc)

近似表达式图像(9)式 (fit)

在这里插入图片描述
在这里插入图片描述

代码:

import matplotlib.pyplot as plt
import numpy as np
import mathdef f_accurate(k, n):if n <= 0 or k <= 0:return -1if n > k:return 1var1 = 1for i in range(k - (n - 1), k + 1):var1 *= (i / k)return 1 - var1def f_fit(k, n):if n <= 0 or k <= 0:return -1if n > k:return 1var1 = (-1) * n * (n - 1) / (2 * k)var2 = math.pow(math.e, var1)return 1 - var2def f_plot_var_n(k, n):acc = []fit = []for i in range(1, n):acc.append(f_accurate(k, i))fit.append(f_fit(k, i))arr = np.array(range(1, n))acc = np.array(acc)fit = np.array(fit)plt.title("crash rate k = {}".format(k))plt.xlabel("n number")plt.ylabel("p(n) rate")plt.plot(arr, acc, color='blue', label='acc')plt.plot(arr, fit, color='red', label='fit')plt.legend()plt.show()def f_plot_var_k(k, n):acc = []fit = []for i in range(1, k):acc.append(f_accurate(i, n))fit.append(f_fit(i, n))arr = np.array(range(1, k))acc = np.array(acc)fit = np.array(fit)plt.title("crash rate n = {}".format(n))plt.xlabel("k number")plt.ylabel("p(k) rate")plt.plot(arr, acc, color='blue', label='acc')plt.plot(arr, fit, color='red', label='fit')plt.legend()plt.show()if __name__ == '__main__':k_value = 365n_value = 365# k_value = 10000# n_value = 100f_plot_var_n(k_value, n_value)# f_plot_var_k(k_value, n_value)

可以看出近似表达式与准确表达式相差不大;

碰撞概率在n=23时,已经达到了50%,而取值空间为[0,365]

这对hash取值空间长度的取舍有参考意义;


http://chatgpt.dhexx.cn/article/JsEdMsat.shtml

相关文章

Hash碰撞(冲突)的解决方案

hash算法就是&#xff0c;用同一个哈希函数计算&#xff1a; 两个相同的值&#xff0c;计算出的hash值一定相同&#xff0c; 两个不同的值&#xff0c;计算出的hash值可能不同&#xff0c;也可能相同&#xff0c;当相同时就是hash冲突 一、链式寻址法 也叫“拉链法”&#…

MD5 hash碰撞实现解密

目录 1.前言 2.MD5 hash单个碰撞解密 3.MD5 hash批量碰撞解密 1.前言 在日常渗透中,获取到后台密码往往是加密的,常见的就是MD5加密,常见的做法我们会使用在线网站去解密,常用的有cmd5,somd5,cmd5对于一些密文是要收费的,有时我们就想白嫖。 这时我们会用so…

哈希碰撞+mysql_HashMap之Hash碰撞冲突解决方案及未来改进

HashMap位置决定与存储 通过前面的源码分析可知&#xff0c;HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。当程序执行put(String,Obect)方法 时&#xff0c;系统将调用String的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法&am…

Hash碰撞概率

计算Hash冲突的概率 虽然已经很多可以选择的Hash函数,但创建一个好的Hash函数仍然是一个活跃的研究领域。一些Hash函数是快的,一些是慢的,一些Hash值均匀地分布在值域上,一些不是。对于我们的目的,让我们假设这个Hash函数是非常好的。它的Hash值均匀地分布在值域上。 在这…

HashMap之Hash碰撞

详细理解了Hash碰撞及处理方法 为什么会出现hash碰撞 在hash算法下,假设两个输入串的值不同,但是得到的hash值相同, 即会产生hash碰撞 一个很简单的例子: 假设你自己设计了一个计算hash的算法toHashValue(String). 是取的输入值的Unicode编码值(当然实际的情况会比这复杂很…

hashmap存储方式 hash碰撞及其解决方式

1.Map 的存储特点 在 Map 这个结构中&#xff0c;数据是以键值对&#xff08;key-value&#xff09;的形式进行存储的&#xff0c;每一个存储进 map 的数据都是一一对应的。 创建一个 Map 结构可以使用 new HashMap() 以及 new TreeMap() 两种方式&#xff0c;两者之间的区别…

Java Hash 碰撞

散列函数&#xff08;英语&#xff1a;Hash function&#xff09;又称散列算法、哈希函数&#xff0c;是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要&#xff0c;使得数据量变小&#xff0c;将数据的格式固定下来。 该函数将数据打乱混合…

通俗解释hash碰撞是什么以及如何解决

Hash如何存数据 hash表的本质其实就是数组&#xff0c;hash表中通常存放的是键值对Entry。 如下图: 这里的学号是个key&#xff0c;哈希表就是根据key值来通过哈希函数计算得到一个值&#xff0c;这个值就是下标值&#xff0c;用来确定这个Entry要存放在哈希表中哪个位置。 H…

Hash碰撞

Hash碰撞 什么是Hash碰撞 Hash碰撞是指两个不同的输入值&#xff0c;经过哈希函数的处理后&#xff0c;得到相同的输出值&#xff0c;这种情况被称之为哈希碰撞。 例如&#xff1a;两个不同的对象&#xff08;object1和object2的值&#xff09;经过Hash函数计算后的&#xf…

浅谈“越权访问”

一&#xff1a;漏洞名称&#xff1a; 越权访问漏洞 描述&#xff1a; 越权访问&#xff0c;这类漏洞是指应用在检查授权&#xff08;Authorization&#xff09;时存在纰漏&#xff0c;使得攻击者在获得低权限用户帐后后&#xff0c;可以利用一些方式绕过权限检查&#xff0c;访…

逻辑越权——垂直、水平越权

水平越权&#xff1a;通过更换的某个ID之类的身份标识&#xff0c;从而使A账号获取&#xff08;修改、删除等&#xff09;B账号数据。 垂直越权&#xff1a;使用低权限身份的账号&#xff0c;发送高权限账号才能有的请求&#xff0c;获得其高权限的操作。 未授权访问&#xff1…

横向越权和纵向越权(水平越权、垂直越权)

越权&#xff1a;顾名思义&#xff0c;就是获得了本不应该有的权限。 我们都喜欢创造一些复杂的词汇&#xff0c;而实际上这些词就是一个代词&#xff0c;根本没有那么复杂。 越权漏洞往往是基于业务逻辑的漏洞&#xff0c;这样的漏洞很难被WAF保护。 越权的分类 按照方向…

越权访问

目录 概念 分类 pikachu--水平越权 源码分析 pikachu---垂直越权 源码分析 概念 越权访问&#xff08;Broken Access Control,BAC&#xff09;是web中一种常见的漏洞&#xff0c;且越权漏洞属于逻辑漏洞&#xff0c;是由于权限校验的逻辑不够严谨导致的&#xff0c;所以越…

Web 攻防之业务安全:越权访问漏洞 测试.

Web 攻防之业务安全&#xff1a;越权访问漏洞 测试. 由于没有对用户权限进行严格的判断&#xff0c;导致低权限的账号&#xff08;比如普通用户&#xff09;可以去完成高权限账号&#xff08;比如超级管理员&#xff09;范围内的操作。&#xff08;比如&#xff1a;通过更换的…

越权漏洞系列

0x01&#xff1a;越权的定义 越权漏洞是我们在测试过程中遇到比较多的漏洞&#xff0c;我们可以这样来理解越权漏洞&#xff0c;一个用户A一般只能够对自己本身的信息进行增删改查&#xff0c;然而由于后台开发人员的疏忽&#xff0c;没有在信息进行增删改查时候进行用户判断&…

java越权问题

关于java项目越权问题 问题描述实现思路具体代码 项目上线前做了安全扫描&#xff0c;安全部门扫描出一个关于越权的问题。这个问题是在刚开始开发接口的时候没有考虑到的一个事情。&#xff08;此项目是有关于用户所拥有的项目和活动权限的问题。&#xff09; 问题描述 首先…

越权 漏洞

一、越权漏洞描述 越权访问&#xff08;Broken Access Control&#xff0c;简称 BAC&#xff09;是 Web 应用程序中一种常见的漏洞&#xff0c;由于其存在范围广、危害大&#xff0c;被 OWASP 列为 Web 应用十大安全隐患的第二名。 该漏洞是指应用在检查授权时存在纰漏&#x…

详解越权漏洞

文章目录 1.1. 漏洞原理1.2. 漏洞分类1.2.1. 水平越权1.2.2. 垂直越权 1.3. 漏洞举例1.3.1. 水平越权1.3.2. 垂直越权 1.4. 漏洞危害1.5. 修复建议 1.1. 漏洞原理 越权漏洞是指应用程序未对当前用户操作的身份权限进行严格校验&#xff0c;导致用户可以操作超出自己管理权限范…

网络安全笔记 -- 逻辑越权(水平垂直越权)

1. 逻辑越权 越权&#xff1a; 水平越权、垂直越权登录 暴力破解本地加密传输Cookie脆弱Session劫持密文对比认证 业务&#xff1a; 订单ID、手机号码、用户ID、商品ID等数据&#xff1a; 支付篡改、数量篡改、请求重放等找回&#xff1a; 客户端回显、Response状态值、Sessio…

渗透测试-越权漏洞之垂直越权和水平越权

越权漏洞之垂直越权和水平越权 文章目录 越权漏洞之垂直越权和水平越权前言一、什么是越权漏洞以及漏洞产生的原因1. 什么是越权漏洞2. 漏洞产生的原因 二、水平越权和垂直越权以及防御方法1.水平越权和垂直越权2.越权漏洞的防御方法 总结 前言 一、什么是越权漏洞以及漏洞产生…