24 / 736HASH

Hash

密码学指纹

一种简短的数字指纹,用来比较数据并发现变化。

哈希是对数据进行计算得到的结果,数据可以是文件,也可以是比特币交易。相同的数据采用相同方法,会得到相同指纹。密码学哈希的设计目标,是让人难以找到结果相同的其他数据,或为指定结果找到合适的输入。它不是原始数据的加密副本。

你下载了一个安装文件。发布者提供了校验指纹,你用同一算法计算下载副本的指纹。如果两者不同,说明数据不一致:文件可能损坏、被替换或被修改。反过来,与可信指纹一致,能为拿到正确副本提供有力保障,无须手工逐一比较整个文件。例如,SHA-256 生成 256 位的结果,通常写成 64 个十六进制字符;无论输入是短消息还是大文件,结果长度都一样。 [1] [3]

关键在于参考指纹来自哪里。如果攻击者同时替换网站上的文件及其公布的哈希,两者依然会匹配。计算哈希不需要秘密密钥,任何人都能计算公开数据的哈希。因此,它不同于由密钥持有者确认数据的数字签名。验证 Bitcoin Core 下载文件时,除了核对文件哈希,还要验证指纹列表的签名,以及签名密钥是否可信。哈希本身不能证明作者身份、程序安全性或文档内容的真实性。 [3]

哈希没有名为“解密”的逆向步骤。固定长度的结果不包含整个文件,因此不能用来备份。不过,这不代表哈希能安全地隐藏任意输入。如果有人对常见的短密码取哈希,攻击者可以尝试可能的密码并比较指纹。不需要逆转函数,只要猜中输入即可。因此,单独使用快速哈希,既不能替代强密码,也不能替代专门设计的安全密码存储方法。 [1] [5]

寻找 preimage(原像)时,目标哈希已经给定,需要找出能产生它的数据。寻找碰撞时,找到任意两个不同输入、使其哈希相同即可。碰撞在数学上必然存在,因为可能的输入比固定长度的输出更多。密码学函数的安全性在于,实际寻找这些情况极其困难,而不是它们绝不可能发生。此外,“哈希”不是某一个算法的专名,并非所有哈希函数都为密码学安全而设计。 [1]

比特币用哈希标识交易、连接区块和验证挖矿工作,但具体计算方法并不相同。区块头哈希使用两次 SHA-256;HASH160 组合使用 SHA-256 和 RIPEMD-160。Tagged hash 还通过标签区分不同计算用途。自行验证结果时,既要选对算法,也要使用完全正确的输入字节,也就是数据的基本单位。文本“61”的字节与十六进制值为 61 的单个字节不同,后者在 ASCII 中表示字母 a。因此,对显示出来的写法取哈希,并不等于对数据本身取哈希。 [2] [4]

要获得更完整的理解,请将本词条与以下词条结合阅读: SHA-256, Proof of Work, Block Header, 交易, Merkle Tree, Bitcoin. 反向关联还来自: SHA-256, Nonce, HTLC, Hashcash.

DOC · 001NIST FIPS 180-4: Secure Hash Standard一手来源 DOC · 002Bitcoin Core v29.0: hash constructions一手来源 DOC · 003Bitcoin Core: Verify your download一手来源 DOC · 004BIP340: tagged hashes一手来源 DOC · 005NIST SP800-63B: Password verifiers一手来源
修订日期: 来源优先 · 非投资建议