关于哈希(散列)函数你应该知道的东西
创始人
2024-03-02 05:26:38
0

从输出的哈希值反推回输入,这从计算的角度是不可行的。

无论安全从业人员用计算机做什么,有一种工具对他们每个人都很有用:加密 哈希(散列) hash 函数。这听起来很神秘、很专业,甚至可能有点乏味,但是, 在这里,关于什么是哈希函数以及它们为什么对你很重要,我会作出一个简洁的解释。

加密哈希函数,比如 SHA-256 或者 MD5,接受一组二进制数据(通常是字节)作为输入,并且对每个可能的输入集给出一个 希望唯一 hopefully unique 的输出。对于任意模式的输入,给定的哈希函数的输出(“哈希值”)的长度都是一样的(对于 SHA-256,是 32 字节或者 256 比特,这从名字中就能看出来)。最重要的是:从输出的哈希值反推回输入,这从计算的角度是 不可行的 implausible (密码学家讨厌 “ 不可能 impossible ” 这个词)。这就是为什么它们有时候被称作 单向哈希函数 one-way hash function 。

但是哈希函数是用来做什么的呢?为什么“唯一”的属性如此重要?

唯一的输出

在描述哈希函数的输出时,“ 希望唯一 hopefully unique ”这个短语是至关重要的,因为哈希函数就是用来呈现完全唯一的输出。比如,哈希函数可以用于验证 下载的文件副本的每一个字节是否和 下载的文件一样。你下载一个 Linux 的 ISO 文件或者从 Linux 的仓库中下载软件时,你会看到使用这个验证过程。没有了唯一性,这个技术就没用了,至少就通常的目的而言是这样的。

如果两个不同的输入产生了相同的输出,那么这样的哈希过程就称作“ 碰撞 collision ”。事实上,MD5 算法已经被弃用,因为虽然可能性微乎其微,但它现在可以用市面上的硬件和软件系统找到碰撞。

另外一个重要的特性是,消息中的一个微小变化,甚至只是改变一个比特位,都可能会在输出中产生一个明显的变化(这就是“ 雪崩效应 avalanche effect ”)。

验证二进制数据

哈希函数的典型用途是当有人给你一段二进制数据,确保这些数据是你所期望的。无论是文本、可执行文件、视频、图像或者一个完整的数据库数据,在计算世界中,所有的数据都可以用二进制的形式进行描述,所以至少可以这么说,哈希是广泛适用的。直接比较二进制数据是非常缓慢的且计算量巨大,但是哈希函数在设计上非常快。给定两个大小为几 M 或者几 G 的文件,你可以事先生成它们的哈希值,然后在需要的时候再进行比较。

通常,对哈希值进行签名比对大型数据集本身进行签名更容易。这个特性太重要了,以至于密码学中对哈希值最常见的应用就是生成“数字”签名。

由于生成数据的哈希值很容易,所以通常不需要有两套数据。假设你想在你的电脑上运行一个可执行文件。但是在你运行之前,你需要检查这个文件就是你要的文件,没有被黑客篡改。你可以方便快捷的对文件生成哈希值,只要你有一个这个哈希值的副本,你就可以相当肯定这就是你想要的文件。

下面是一个简单的例子:

$ shasum -a256 ~/bin/fop
87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c  /home/bob/bin/fop

如果我知道 fop 这个可执行文件的 SHA-256 校验和,这是由供应商(这个例子中是 Apache 基金会)提供的:

87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c

然后我就可以确信,我驱动器上的这个可执行文件和 Apache 基金会网站上发布的文件是一模一样的。这就是哈希函数难以发生碰撞(或者至少是 很难通过计算得到碰撞)这个性质的重要之处。如果黑客能将真实文件用哈希值相同的文件轻易的进行替换,那么这个验证过程就毫无用处。

事实上,这些性质还有更技术性的名称,我上面所描述的将三个重要的属性混在了一起。更准确地说,这些技术名称是:

  1. 抗原像性 pre-image resistance :给定一个哈希值,即使知道用了什么哈希函数,也很难得到用于创建它的消息。
  2. 抗次原像性 second pre-image resistance :给定一个消息,很难找到另一个消息,使得这个消息可以产生相同的哈希值。
  3. 抗碰撞性 collision resistance :很难得到任意两个可以产生相同哈希值的消息。

抗碰撞性抗次原像性 也许听上去是同样的性质,但它们具有细微而显著的不同。抗次原像性 说的是如果 已经 有了一个消息,你也很难得到另一个与之哈希值相匹配的消息。抗碰撞性 使你很难找到两个可以生成相同哈希值的消息,并且要在哈希函数中实现这一性质则更加困难。

让我回到黑客试图替换文件(可以通过哈希值进行校验)的场景。现在,要在“外面”使用加密哈希算法(除了使用那些在现实世界中由独角兽公司开发的完全无 Bug 且安全的实现之外),还有一些重要且困难的附加条件需要满足。认真的读者可能已经想到了其中一些,特别需要指出的是:

  1. 你必须确保自己所拥有的哈希值副本也没有被篡改。
  2. 你必须确保执行哈希算法的实体能够正确执行并报告了结果。
  3. 你必须确保对比两个哈希值的实体确实报告了这个对比的正确结果。

确保你能满足这些条件绝对不是一件容易的事。这就是 可信平台模块 Trusted Platform Modules (TPM)成为许多计算系统一部分的原因之一。它们扮演着信任的硬件基础,可以为验证重要二进制数据真实性的加密工具提供保证。TPM 对于现实中的系统来说是有用且重要的工具,我也打算将来写一篇关于 TPM 的文章。


via: https://opensource.com/article/20/7/hash-functions

作者:Mike Bursell 选题:lujun9972 译者:Yufei-Yan 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

给AI玩具设一道隐私“防火...
江德斌 据6月9日央视网报道,从能讲故事的智能玩偶,到可情感交互的...
2025-06-13 07:14:10
【C++进阶】十、用哈希表...
目录 一、改造哈希表 1.1 节点定义  1.2 哈希表迭代器相关...
2025-06-01 02:42:48
某租房平台AES加密解密
本次逆向站点aHR0cHM6Ly93d3cubWFvbWFvenU...
2025-06-01 00:48:12
【C++进阶】五、哈希表
目录 一、哈希概念 二、哈希冲突 三、哈希函数 四、哈希冲突解决 ...
2025-05-30 19:32:01
CentOS上安装或更新O...
CentOS与OpenSSL 1.0:关键技术与安全实践探讨 在服...
2025-03-14 07:40:24
“黑箱”,AI开始自言自语...
文丨陆弃 近日,一段由人工智能(AI)进行的对话视频在网络上引发了...
2025-02-26 15:49:28

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...