证书

2 文章

哈希算法创造奇迹

密码哈希函数(通常简称为哈希算法)是一种数学算法,用于将任意一组数据转换成长度固定的一串新字符。不管输入数据的长度是多少,同类型的哈希算法始终输出固定长度的哈希值。 因此,根据网上的SHA-1哈希生成器(SHA-1与MD 5和SHA-2都是部署最广泛的一种计算哈希函数),比如我的名字Brian生成的哈希值为:75c450c3f963befb912ee79f0b63e563652780f0。可能其他”Brian”会告诉你说,Brian这个名字被误拼成”brain”是极为常见的事。实际上,我以前有一张驾照上面的名字就被拼成了”Brain Donohue”,但这另一个故事了。brain通过在线SHA-1生成器生成的SHA-1哈希值是:8b9248a4e0b64bbccf82e7723a3734279bf9bbc4。 你看,这两个输出值截然不同,虽然在名字中Brian和表示中枢神经系统器官的这个单词brain之间差异完全在于连续的两个元音字母的位置(”ia”和”ai”)。更明白地说,如果我只把名字的第一个字母改为小写,SHA-1生成器的也会返回完全不同的哈希值:760e7dab2836853c63805033e514668301fa9c47。 密码哈希函数是计算中使用最普遍的工具,几乎可用于一切计算,从身份验证到恶意软件检测再到文件保护。   您会注意到,上述所有哈希值的长度都是40个字符,这并不令人吃惊,因为上面输入内容的长度均为5个字符。但如果在哈希生成器中输入本文到目前为止的所有单词,你会吃惊地发现返回以下哈希值:db8471259c92193d6072c51ce61dacfdda0ac3d7。也就是这1637个左右的字符(包括空格)和上面的5个字符的单词一样,经压缩后输出40个字符。你可以用SHA-1哈希算法对莎士比亚全集进行计算,最终也是输出40个字符。而最让人吃惊的是绝不会有两个不同的输入生成相同的哈希输出。 下图由Wikimedia Commons制作,说明的是上述概念,供您直观地学习: 哈希算法适用于哪些情况? 问得好。但很遗憾,答案是密码哈希算法适用于很多很多种情况。 对你我来说,最常见一种哈希算法形式是对密码进行哈希加密。例如,如果忘记了某个在线服务的密码,则很可能必须执行密码重置。重置密码时,通常你不会收到返回的明文密码。原因是在线服务并不会存储您的明文密码,而是存储密码的哈希值。事实上,该服务(除非使用的是极其简单的密码,这种密码的哈希值广为人知)并不知道您的真正密码。 确切地说,就是如果你收到的返回密码是明文,则说明你使用的在线服务未对密码进行哈希加密,这不失为一种羞耻。 您可以通过在线逆向哈希生成器自行进行测试。如果生成不安全密码(例如,”password”或”123456″)的哈希值,则在逆向哈希生成器中输入该哈希值时,逆向哈希生成器很可能会识别出示例中任一密码的哈希值。对于前文所举示例,逆向哈希生成器可以识别出”brain”和”Brian”的哈希值,但无法识别出代表本文正文的哈希值。所以哈希值输出的安全性完全依赖于输入数据,而输入数据几乎可以为任何内容。 对于这一点,据上月晚些时候TechCrunch的报告,流行的云存储服务Dropbox依据美国《数字千年版权法》,阻止了一名用户共享受保护内容。该用户在Twitter上写道,他被阻止共享特定内容,这一事件经由Twitter迅速发酵升温,人们对于Dropbox必定窃取了用户内容而大为不满,尽管隐私政策中明确承诺不会这样做。 当然Dropbox实际上并未窃取任何用户内容。据TechCrunch的文章中所述,导致这一事件发生的可能原因是版权持有者拿到版权文件(也许是数字版歌曲或电影)后,通过哈希函数来传送该文件。取得输出的哈希值后,他们将这一串40个字符加入了某种版权保护资料哈希黑名单。这样在用户尝试分享该版权保护资料时,Dropbox的自动扫描程序就会挑选出列入黑名单的哈希值,从而阻止资料分享。 所以,显然你可以对密码和媒体文件进行哈希加密,但密码哈希函数还有哪些其他用途呢?同样,实际答案是哈希函数的用途远远超出我的所知,也不在我的写作关心范围内。但是还有一个非常贴心的哈希应用是Kaspersky Daily。哈希算法被卡巴斯基实验室等反病毒软件公司用于恶意软件检测,部署广泛。 同样,电影制片厂和唱片公司也制定了哈希黑名单来保护版权数据,此外还有数量不定的恶意软件哈希值黑名单,其中大多数公开提供。这些恶意软件哈希(或恶意软件签名)黑名单由恶意软件哈希值或更小的可识别恶意软件组件的哈希值构成。一方面,如果用户发现了可疑文件,则可以在众多公共可用的恶意软件哈希注册表或数据库中选择一个来输入该文件的哈希值,输入后注册表或数据库会通知用户该文件是否为恶意文件。另一方面,反病毒引擎识别并最终阻止恶意软件的一种方法就是将文件哈希值与引擎自己的(以及公开的)恶意软件签名存储库中的进行比对。 密码哈希函数还可用于确保消息完整性。换言之,你可以借此确保某个通信或文件未被窃取,方法是检查数据传输前后生成的哈希输出值是否一致。如果前后哈希值完全一致,则传输可称得上是可靠的。