发布时间:2025-02-01 13:31:21 点击量:
HASH GAME - Online Skill Game GET 300
一些网盘之类的文件扫描、文件秒传也是用哈希算法实现的。秒传的原理就是在上传文件前,客户端先把文件的哈希值计算出来并告诉服务器,服务器就去查找是否有存储过对应哈希值的文件,有的话就直接告诉客户端这文件已经存储过了,然后客户端就直接告诉用户文件上传完成,没有的话再去真正地上传文件。违规文件扫描也是这样的,服务器存储违规文件的哈希值,这样客户端上传文件的时候只要文件的哈希值被识别为违规,那上传就会直接被拒绝。这也是为什么一些聊天软件的图片屏蔽也只要改原图的一个像素都可以轻易绕过,因为哈希算法对输入非常敏感,改一个字节算出的哈希值都完全不同。只用哈希算法进行的文件校验都可以通过修改文件内容(哪怕只改一个字)的方法直接绕过
我虽然知道114514的md5值是c4d038b4bed09fdb1471ef51ec3a32cd,但没法用c4d038b4bed09fdb1471ef51ec3a32cd反推出114514,那怎么办?简单,那就自己搞个数据库,在里面存入数据c4d038b4bed09fdb1471ef51ec3a32cd = 114514。既然没法逆推出原始数据,那就生成一堆常见的数据,并把它们的哈希值算出来,再存进我自己这个数据库里,这样下次遇到对应的哈希值就去查自己的数据库就好了。当然,你不可能穷举所有的排列组合并把它们的哈希值都存储起来,因此这个方法也只能破解常见密码的哈希值
但如果我给p@ssword后面加上TURaWg==再计算md5值呢?那p@sswordTURaWg==的md5值就是17e7c834da0551e8872d77f741b58bbc,和刚刚的值完全不同(别忘了上文说的哈希算法具有雪崩效应,差一个字结果都完全不同),你再去这些破解网站就查不出来了。这样就算泄露了密码哈希值和盐的值,攻击者也必须得重新跑一遍彩虹表才有可能得知用户的密码是否是某些常见密码,要付出极高的时间成本。但假如我给每个用户都加上随机的的盐呢?那攻击者就真要疯了,要是还想暴力破解的话得针对每个用户都去跑个彩虹表,时间成本高到根本无法接受(当然这样依然是有可能跑出简单的密码的,所以别使用常见或简单的密码)
以md5为例,它输出的结果是个32位的16进制数,那就一共有 16^32^ = 768211456 种可能的排列组合。别的哈希算法的组合可能更多,但本质还是一样的。虽然这个数非常大,但跟哈希算法可能遇到的各种输入,这个数是远远不够的。计算哈希值的时候都会丢失很多的信息。由于鸽笼原理可知,当我们把10个鸽子存进5个笼子的时候,必定有至少一个笼子里有一只以上的鸽子。因此,当数据的排列组合够多的时候,必然也会产生哈希碰撞,即两个不一样的数据能计算出相同的哈希值。举个最简单的例子,md5的输出是32位的16进制数,那你给他输入100位的16进制数的所有排列组合,它一定会生成很多一样的哈希值
不过虽然存在哈希碰撞这种攻击手段,但这并不是说哈希算法就一无是处,就能随便生成相同的哈希值了。虽然理论上是一定可以生成哈希值相同的数据的,但实际上要找到这样的数据是极其困难的,哪怕是已经被证明有缺陷的md5也只能生成两个哈希值相同的文件。对于一个给定的md5值,还是没法逆推出原数据或者可以和原数据哈希碰撞的值。而且现在有不少算法至今仍未被找出碰撞案例,例如sha-256、sha-384和sha-512算法。即使是已被证明为不安全的哈希算法,我们仍然可以在对安全性没什么要求的地方继续使用它们进行简单的验证。但在安全性要求高的地方,还是得用安全的哈希算法来进行各种操作