ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

揭秘哈希值:文件的神秘DNA指纹

揭秘哈希值:文件的神秘DNA指纹 文章目录看个类比DNA指纹技术那么哈希是啥详解哈希函数的性质应用文件对比与错误处理密码存储与认证文件命名与存储攻击md5结语本文由Jzwalliser原创发布在CSDN平台上遵循CC 4.0 BY-NC-SA协议。因此若需转载/引用本文请注明作者并附原文链接不得用于商业用途。违者必究谢谢配合。个人主页blog.csdn.net/jzwalliser从网上下载文件的时候经常能够看到这样一串长长的、没有什么含义的东西cb6bf42a449b0bb1f53c534bcbcc220c这到底是啥有什么用答曰这就是哈希或者叫散列值。这篇文章我们就来看看它是什么吧。看个类比在介绍哈希之前先来看个类比吧这样估计更好理解。DNA指纹技术DNA指纹技术非常重要有许多应用。在《普通高中生物学 必修二》的课本上就介绍了它。原话是这么说的有兴趣的可以翻到课本第52页在现代刑侦领域中DNA指纹技术发挥着越来越重要的作用。只要一滴血、精液或是一根头发等样品刑侦人员就可以进行DNA指纹鉴定。它的原理是这样的通过在犯罪现场提取血液、毛发等可以得到嫌疑人的DNA样本再用一种特殊的“分子剪刀”即限制酶便能把长长的DNA剪成许多长短不一的片段。不同人的DNA剪出来的片段长度模式是不一样的同卵双胞胎除外。把剪好的片段放到凝胶里通电DNA片段就会在凝胶上移动——短的跑得快、长的跑得慢最终就在胶上形成一条条“带”——这就是电泳条带图像一个条形码。图片来自《普通高中生物学 必修二》人民教育出版社最后把现场样品的条带图与嫌疑人的条带图放在一起看如果条带模式一模一样就说明是同一个人。这种方式为刑侦工作提供了极大的便利整个过程中我们虽然需要提取DNA但是用不着一个个地比对DNA序列不然工作实在是太繁重了。我们通过一种特殊方式将提取出的DNA转化为了另外一个东西——电泳条带图。只需要对比一下电泳条带图长得是否一样就能知道原来的DNA是否一样从而就能知道是否是同一个人了。而这和哈希简直是异曲同工那么哈希是啥哈希就像对文件做了一次“DNA酶切电泳”它将文件切碎并由原始文件派生出独特的指纹——这样我们只需要对比文件的指纹是否一样就能确定原来的文件是否一样。而这个指纹我们就叫“哈希值”。这些就是典型的哈希值猜猜这是谁的哈希ed076287532e86365e841e92bfc50d8cmd57f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069sha256861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8sha512给哈希函数输入数据后其将通过一系列的计算输出一段长长的数字。是的是十六进制数本质是一串二进制位。今天计算机科学家们已经研究出了很多种不同的哈希函数包括CRC32、Adler32、MD2、MD4、MD5、SHA1、SHA224、SHA256、SHA384、SHA512、SHA3-224、SHA3-256、SHA3-384、SHA3-512等。它们各有所长服务于不同的目的。然而它们有同样的功能都能给一份特定的文件生成独特的指纹。对了“哈希”这个词其实来自英语单词“hash”的音译。在英语中它的本意是n. 剁碎的食物混杂拼凑重新表述vt. 搞糟把…弄乱切细推敲释义来自欧路词典由此也可以联想到电脑中的“哈希”所干的活了把文件剁碎了重组。详解哈希函数的性质一个合格的哈希函数一般来说都有以下特征。输出长度固定。即使一个文件大小2GB、100GB甚至50TB哈希函数的输出长度也应该保持恒定而不能随着文件变大而输出变长。就比如说md5的输出永远是128比特sha512的输出永远是512比特不会改变。输出结果不可逆推输入。哈希函数是典型的“单向陷门函数”通过md5输出的哈希值无法推知原来的输入是什么。这也很好理解假如把大小为2GB的文件变成了长度仅有……的md5那么其中损失了大量的数据因而无法回推。极难反向构造。在“不可逆推输入”上又更进了一步不仅得不到原始文件甚至连构造都很难。很难构造出某个文件使其哈希值恰好为某个特定的值。当然不是不可能而是难度极高且大多数的哈希还不存在反向构造的方法。碰撞概率极低。对于任意两个文件如果文件内容不一样那么两者的哈希值几乎不可能想等——即使两个文件只相差一个字节它们的哈希也天差地别。就像两个人的DNA不同电泳条带图就几乎不可能相同。相同文件相同输出。对于同一个哈希函数来说如果输入的两个文件是相同的那么输出结果就应该是相同的。计算速度很快。虽然现代 CPU 越来越快但哈希函数依然需要保持高效尤其在处理大文件或高并发请求时。应用哈希发明出来有什么用呢文件对比与错误处理相同文件相同输出。只需要对比哈希是否相同就能知道两个文件是否相同。例如你从网上下载了一个文件但是很担心文件在传输过程中发生了损坏。此时你只需要让服务器计算一下文件的哈希再在你自己的电脑上算一遍文件的哈希——两者一对比如果是相等的那么就能确定你下载的文件没有损坏反之亦然。密码存储与认证一般来说在平台上注册账号的时候都会要求你设置一个密码验证码登录的不算。不过用户设置的密码是肯定不能以明文的形式保存在服务器上——万一服务器被黑客干了那不密码全泄漏了吗因此在存储密码的时候一般都会对密码进行哈希把它转化成一串长长的的哈希值。之后若要验证密码是否正确只需要对比用户提供的密码与服务器上密码的哈希值就行了。哈希值一样那么密码输入正确不一样则密码错误。而且根据哈希“输出结果不可逆推输入”以及“极难反向构造”的性质就连服务器它自己都不知道你的密码是什么它只能验证密码是否正确。这样即使密码泄漏黑客得到的也不过是一大堆哈希值而无从得知密码当然实际工程中还会给每个密码加上一段随机“盐”然后再用哈希保存这样可以防止彩虹表攻击。文件命名与存储很多应用程序在存储文件的时候为了防止文件名相同而导致文件相互覆盖就把文件名称设置为了文件的哈希。因为哈希具有“碰撞概率极低”的性质只要文件内容不一样哈希就不一样文件名就不会重复文件就不会相互覆盖。而且哈希还有“相同文件相同输出”的性质若文件数据相同文件名就相同系统可以借此只保留一份文件内容从而节省存储空间——简直是一举两得太完美了攻击md5然而哈希不是万能的。根据之前的一项研究在主流的哈希算法md5和sha家族中md5哈希被证实是不太安全的。在数学中有这样一条结论根据鸽巢原理或抽屉原理如果定义域是无穷集合而值域是有限集合那么必然存在至少两个不同的定义域元素映射到同一个值。说人话版本不同的文件可以有无穷多个而哈希的输出却是有限的例如md5哈希一共128比特所以总共有2 128 2^{128}2128个不同的哈希值。这就说明对于任何一个哈希函数来说无论其抗碰撞能力有多好都势必存在两个文件它们的内容不一样但是哈希值却是相同的。了解过“生日悖论”同学也知道当你手头上有哈希值总数 \sqrt{哈希值总数}哈希值总数​个文件时就已经有超过50%的碰撞概率了。当数量再增加一些大约2.45 N 2.45\sqrt N2.45N​概率会迅速升高到90%以上。不过对与sha256来说2 256 2 128 \sqrt{2^{256}}2^{128}2256​2128依然是一个天文数字所以实际中不用担心。而我前面也提到了md5已被证实不安全。那么有没有可能可以“人为地”构造出两个文件其内容不同但md5相同答现在有了。虽然不能完美地“反向构造”指定一个md5然后构造出符合条件的文件但也足以引起重视。密码学家如王小云教授已经研究出了实用的碰撞攻击方法可以构造两个内容不同md5相同的文件甚至可以在正常文件后面附加一些数据得到另一个md5相同的恶意文件。有兴趣的同学可以上网搜搜fastcol.exe它可以演示这种碰撞。类似的sha1也在 2017 年就被 Google 宣布碰撞攻击成功因而变得不再安全。所以说开发软件的时候呢不建议使用md5、sha1这样不安全。不过sha224即以上倒是OK的因为暂时还没有方法能像破解md5、sha1那样破解它们。结语哈希很短但世界很长。当你下次看到那串十六进制数时你就知道辣它就是文件在数字世界里的 DNA 条带图。下期想了解点什么评论区见
返回列表