加密哈希函数

定义

加密哈希函数是一种数学算法,它接受任何大小的输入数据,并将其转换为固定长度的摘要。一些现代版本,称为可扩展输出函数(XOF),可以生成长度可自定义的输出。哈希函数具有几个基本特性:它们是确定性的,这意味着相同的输入总是产生相同的输出;它们是抗原像的,因此实际上不可能通过逆哈希值找到原始输入;它们是抗碰撞的,因此几乎不可能找到两个不同的输入产生相同的哈希值;它们还具有雪崩效应,即即使输入发生微小的变化也会导致完全不同的输出。比特币使用 SHA-256 进行挖矿和交易哈希,而以太坊使用 Keccak-256,它是 SHA-3 的一个变体。哈希函数是区块链安全的基础——它们支持从挖矿工作量证明到创建默克尔树证明和签署交易等所有功能。

哈希函数特性详解

SHA-256 哈希示例:输入:“Hello” 输出:185f8db32271fe25f561a6fc938b2e26…

输入:“hello”(小写) 输出:2cf24dba5fb0a30e26e83b2ac5b9e29e… → 完全不同(雪崩效应)

输入:10MB 电影文件 输出:仍然只有 64 个十六进制字符(256 位)→ 输出大小固定,与输入大小无关

原像抗性演示:目标:找到能生成“0000abc…”的输入。唯一方法:暴力破解(尝试数十亿个输入)。比特币挖矿:正是如此——找到生成低于目标哈希值的随机数。在 500 exahash/秒(比特币网络)的情况下:大约需要 500,000,000,000,000,000,000 次尝试/秒。

抗碰撞性:目标:找到两个不同的输入,生成相同的哈希值。SHA-256:未发现碰撞(需要 2^128 次操作才能找到一个碰撞)。SHA-1(已弃用):发现碰撞(Google,2017)→ 不再受信任。

加密中使用的哈希函数

散列函数 输出大小 用在 状态
SHA-256 256 bits 比特币(挖矿、交易) 安全消息传递
凯卡克256 256 bits 以太坊(地址、交易) 安全消息传递
SHA-3-256 256 bits 一些较新的协议 安全消息传递
布莱克2/布莱克3 变量(作为 XOF) Zcash,一些协议 安全、快捷
SHA-1 160 bits 旧版(已弃用) 已损坏(发现碰撞)
MD5 128 bits 旧版(已弃用) 损坏(碰撞微不足道)
RIPEMD-160 160 bits 比特币地址推导 安全(采用 SHA-256)

常见问题解答

问:为什么我们不能通过反转哈希值来找到输入?

哈希函数涉及不可逆的数学运算——它们会刻意丢弃信息。你可以验证 hash(input) = output,但你无法通过数学方法逆转 hash(output) → input。目前已知的唯一通用攻击方法是暴力破解:尝试大量输入,直到找到一个哈希值等于目标值的输入。对于 256 位输出,这需要大约 2^256 次尝试——比可观测宇宙中的原子数量还要多。正是这种不可逆性使得哈希函数在密码存储、数字签名和工作量证明等领域非常有用。

问:什么是“雪崩效应”?它为什么重要?

雪崩效应意味着,即使输入数据中只改变一位(一个字符),也会导致哈希输出完全不同——通常输出数据中大约一半的位会发生变化。这对区块链安全至关重要:如果区块头被哪怕是微小的修改(例如更改时间戳或交易),哈希值也会完全改变并失效,需要重新计算整个工作量证明。这使得区块链交易历史实际上不可篡改。

问:哈希函数在数字签名中是如何使用的?

与其直接对大型文档进行签名,不如先对文档进行哈希处理(无论文档大小,哈希值均为 256 位),然后用私钥对哈希值进行签名。这种方法效率很高(对固定大小的哈希值进行签名比对 GB 级文件进行签名快得多),并且能够保证安全性(签名证明您已对特定文档进行签名——任何修改都会改变哈希值并使签名失效)。所有区块链交易签名都遵循这种模式。

新闻