MSTR Cat

区块链/等级 II · 运作机制/2.1 密码学/课程 2

HASH160:先使用SHA-256,再使用RIPEMD-160

一种缩短密钥的双重哈希,以及它所隐藏的弱点

材料区块浏览器,如 blockstream.info 或 blockchain.com比特币地址样本集文本编辑器或电子表格

好奇

  1. 为什么比特币要依次使用两种不同的哈希函数?
  2. 160位哈希值能提供哪些256位哈希值所不具备的东西?
  3. 一个20字节的哈希值怎么可能既安全又脆弱?

探索

  1. 比特币中的原始公钥在压缩后会变为33字节长。这样的长度对于交易来说过于冗长,难以高效使用。为在不损失加密完整性的前提下缩短其长度,比特币采用了两步处理方式:先进行SHA-256运算,然后再进行RIPEMD-160运算。这种组合被称为HASH160,最终产生的输出为160位(20字节),长度刚好适合用于地址编码。
  2. RIPEMD-160由Hans Dobbertin、Antoon Bosselaers和Bart Preneel于1996年设计,其输出比SHA-256更短,且源自开放的学术设计流程。首先对公钥(对于P2SH则是脚本)应用SHA-256,然后再对SHA-256的输出应用RIPEMD-160。这一顺序在安全性与效率之间取得了平衡,被用于Pay-to-PubKey-Hash(P2PKH)、Pay-to-Script-Hash(P2SH)以及Pay-to-Witness-PubKey-Hash(P2WPKH)输出中。
  3. 使用两种不同的哈希函数可以增加一层防御机制。这种嵌套结构主要有助于抵御预像攻击,因为要找到与给定哈希值匹配的密钥就意味着必须同时破解这两种哈希函数;但它对碰撞攻击并无帮助,因为任何 SHA-256 碰撞也同样是 HASH160 的碰撞。不过,160 位输出所带来的抗碰撞能力相当于约 80 位,这对于单密钥地址输出来说已经足够了。但在需要多方共同参与的脚本中,这就成了问题,因此 SegWit 和 Taproot 才会为原生脚本使用 32 字节的值。
  4. 有一种常见的说法认为,对密钥进行哈希可以保护币免受未来量子计算机的威胁。但这种保护只是部分的:花费时会暴露公钥,因此它只覆盖那些密钥从未公开过的输出;地址重复使用会使这种保护失效;而 Taproot 输出则直接把公钥放在链上。具备足够能力的量子计算机将威胁任何已暴露的密钥。
  5. 要从公钥生成比特币地址,首先对公钥应用 HASH160,然后在结果前加上网络标识符(主网 P2PKH 为 0x00),再附加一个由双重 SHA-256 得出的 4 字节校验和。随后将这 25 字节的序列进行 Base58 编码,得到人类可读的地址。这种编码去除了容易混淆的字符,并包含校验和以检测抄写错误。
  6. 要在实践中观察这一点,可打开区块浏览器并搜索一笔 P2PKH 交易。找到 scriptPubKey 字段,其中应包含 20 字节的哈希值。将其与该输出被花费时暴露的公钥进行比较,你会发现公钥更长,而哈希值则是地址中所用的、经过缩短和编码的版本。

关键事实

  • HASH160 是 SHA-256 与 RIPEMD-160 的组合。
  • HASH160的输出为160位(20字节)。
  • RIPEMD-160由Hans Dobbertin、Antoon Bosselaers和Bart Preneel于1996年设计。
  • HASH160被用于P2PKH、P2SH和P2WPKH输出脚本中。
  • 160位哈希值所能提供的抗碰撞能力约为80位。
  • 哈希只能在公钥被花费之前将其隐藏;Taproot 输出则直接显示公钥。

练习 九、六、三、一

9收集列出9个比特币地址。注明其格式(以1、3、bc1q、bc1p等开头)以及字符长度。
6归类根据编码类型和脚本类型(如 Base58、Bech32、SegWit 等),将这9个地址分为6组。
3提炼将这6个类别简化为3条原则,用以解释比特币为何采用不同的地址格式。
1凝结用一句话解释比特币为何使用两种哈希函数来生成地址。

事实核查

日期、数字及数据均依据下方列出的已发表资料进行核实。

在互动学院中打开 →

EN PT ES JA KO RU DE FR MS