当前位置: 首页 > 科技观察

关于散列(hash)函数你应该知道的事情

时间:2023-03-14 23:09:58 科技观察

将输出的散列值倒转回输入在计算上是不可行的。无论安全从业者用他们的计算机做什么,都有一个工具对他们每个人都有用:加密散列(hashing)散列函数。这听起来神秘、技术性强,甚至可能有点乏味,但在这里我将简明扼要地解释什么是哈希函数以及它们对您很重要的原因。加密散列函数(例如SHA-256或MD5)将一组二进制数据(通常是字节)作为输入,并给出希望对于每组可能的输入都是唯一的输出。给定哈希函数的输出(“哈希值”)对于任何输入模式都是相同的长度(顾名思义,SHA-256为32字节或256位)。底线:从输出的散列推回到输入在计算上是难以置信的(密码学家讨厌“不可能”这个词)。这就是它们有时被称为单向哈希函数的原因。但是散列函数有什么用呢?为什么“独特”的财产如此重要?唯一输出在描述散列函数的输出时,“希望唯一”这个短语至关重要,因为散列函数旨在呈现完全唯一的输出。例如,可以使用哈希函数来验证您下载的文件副本的每个字节是否与我下载的文件相同。当您下载LinuxISO文件或从Linux存储库下载软件时,您将看到使用此验证过程。没有唯一性,该技术就毫无用处,至少对于一般用途而言是这样。如果两个不同的输入产生相同的输出,那么这样的散列过程称为“碰撞”。事实上,MD5算法已被弃用,因为尽管不太可能,但现在有可能发现与商用硬件和软件系统的冲突。另一个重要的特性是消息中的微小变化,即使只是改变一位,也可能在输出中产生明显的变化(这就是“雪崩效应”)。验证二进制数据散列函数的典型用途是当有人给你一段二进制数据以确保它是你所期望的。无论是文本、可执行文件、视频、图像,还是整个数据数据库,在计算领域,所有数据都可以用二进制来描述,因此散列至少可以说是广泛适用的。直接比较二进制数据非常慢且计算量大,但哈希函数被设计得非常快。给定两个大小为几M或几G的文件,你可以预先生成它们的哈希值,然后在需要的时候进行比较。通常签署散列比签署大型数据集本身更容易。这个属性是如此重要,以至于哈希值在密码学中最常见的应用就是生成“数字”签名。由于很容易生成数据的散列,通常不需要两组数据。假设您想在您的计算机上运行一个可执行文件。但是在你运行它之前,你需要检查这个文件是否是你想要的,并且没有被黑客篡改过。您可以轻松快速地生成文件的散列,只要您拥有散列的副本,就可以非常确定它就是您想要的文件。这是一个简单的例子:$shasum-a256~/bin/fop87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c/home/bob/bin/fop如果我知道供应商提供的fop可执行文件的SHA-256校验和(在本例中是ApacheFoundation):87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c然后我可以确信我的驱动器上的可执行文件与Apache基金会网站上发布的完全相同。这就是哈希函数的碰撞困难(或至少在计算上困难)属性很重要的地方。如果黑客可以轻松地将真实文件替换为具有相同哈希值的文件,则此验证过程将毫无用处。事实上,这些属性有更多的技术名称,我上面描述的名称将三个重要属性集中在一起。更准确地说,这些技术名称是:Pre-imageresistance:给定一个哈希值,很难获得用于创建它的消息,即使知道使用了什么哈希函数也是如此。第二个原像阻力:给定一条消息,很难找到另一条产生相同散列的消息。抗碰撞性:很难得到任意两条消息能够产生相同的哈希值。抗碰撞性和子原像抗性听起来像是同一个属性,但它们有细微但显着的区别。Subprimeresistance说的是,如果你已经有一个消息,你就很难再得到另一个与其哈希值相匹配的消息。抗碰撞性让你很难找到生成相同散列的两条消息,而在散列函数中实现这个属性就更难了。让我回到试图替换文件的黑客(可以通过哈希值来验证)。现在,要“在那里”使用加密哈希算法(除了使用那些由独角兽在现实世界中开发的完全无错误且安全的实现之外),还需要满足一些重要且困难的附加条件。认真的读者可能已经想出了其中的一些,特别是:您必须确保您拥有的哈希副本也没有被篡改。您必须确保执行散列算法的实体正确执行并报告结果。您必须确保比较两个散列的实体实际报告此比较的正确结果。确保您能够满足这些条件绝对不是一件容易的事。这是可信平台模块(TPM)成为许多计算系统的一部分的原因之一。它们充当信任的硬件基础,可以为验证重要二进制数据真实性的加密工具提供保证。TPM是现实世界系统的一个有用且重要的工具,我计划在未来写一篇关于TPM的文章。