区块链/等级 II · 运作机制/2.1 密码学/课程 1
哈希函数与SHA-256
锚定账本的指纹
材料已安装 shasum 或 openssl 的终端在线 SHA-256 计算器两个仅有一个字符不同的文本文件
好奇
- 为什么修改文件中的一个字符就会使其哈希值改变一半?
- 如果无穷多种可能的输入共享一个有限的输出集合,为什么找到两个发生碰撞的输入在计算上仍然不可行?
- 在其前身 SHA-1 被攻破的情况下,是什么让 SHA-256 依然安全?
探索
- 密码学哈希函数能够将任意长度的数据映射为固定长度的摘要。它具有确定性:相同的输入总是产生完全相同的输出。它计算速度快,却无法被逆向还原。这种单向性定义了抗原像性:攻击者即便只掌握哈希值,也无法推导出原始消息。正是这种不可逆性,为分布式系统中的完整性校验与身份证明提供了安全保障。
- 无论输入大小如何,SHA-256都会生成256位的输出。无论输入是单个字节还是GB级的文件,其摘要始终恰好为32字节。这种固定长度使存储和比较保持一致。该算法将数据划分为512位的数据块,每块经过64轮逻辑运算。它的设计遵循Merkle–Damgård结构,在各数据块之间串联一个压缩函数;正是压缩函数的混合运算将输出彻底打乱。
- 雪崩效应是一个重要特性:输入中一个比特的改变会导致输出哈希值中大约一半的比特发生变化。这种高敏感性确保了哪怕是微小的数据损坏或篡改也会使哈希值完全不同。正因如此,哈希函数非常适合用于验证文件完整性以及检测数据是否被修改。任何改动,无论多么细微,都会打破预期哈希值与计算所得哈希值之间的匹配关系。
- 抗碰撞性是要求最严苛的特性。根据生日界,要找到两个能产生相同哈希值的不同输入,大约需要2^128次运算。对于SHA-256而言,如此高的计算成本使得在现有硬件条件下进行暴力攻击变得不切实际。相比之下,SHA-1在2017年遭到了谷歌和CWI研究人员演示的实际可行的碰撞攻击,该攻击被称为SHAttered。这一漏洞迫使对安全性要求较高的应用弃用SHA-1。
- 比特币会连续两次应用SHA-256,这种做法被称为双重哈希。区块头和交易ID先经过SHA-256哈希,得到的结果再用SHA-256哈希一次。中本聪从未解释过这一选择;常见的解释是为了防范长度扩展攻击,这是SHA-256这类Merkle–Damgård型哈希函数的已知特性。链上的每一个区块哈希和交易ID都是这两轮哈希的输出。
- 打开任意终端或在线工具,计算字符串‘MSTR Cat’的SHA-256哈希值。然后仅改变其中一个字母的大小写,计算‘MSTR cat’的哈希值。比较这两个由64个字符组成的十六进制输出——它们将完全不同,看不出任何可辨识的规律。这种立即出现的差异正是雪崩效应的实际体现:仅仅一个比特的变化就会彻底打乱整个摘要,证明该函数对输入极为敏感。
关键事实
- 无论输入大小如何,SHA-256都会生成固定的256位输出。
- 雪崩效应意味着一个比特的变化会改变大约一半的哈希比特。
- 通过暴力方法找到 SHA-256 的碰撞值需要大约 2^128 次运算。
- 2017年,SHA-1被一种实际可行的碰撞攻击(SHAttered)攻破。
- 比特币使用双重 SHA-256 来生成区块哈希和交易ID。
- SHA-256以512位为一个数据块,经过64轮运算处理数据。
练习 九、六、三、一
9收集列出9种在计算机中使用的哈希函数或校验和算法。注明它们的输出长度及主要应用场景。
6归类按照安全强度,将这9种归入6类:已被攻破、已弃用、通用标准、高安全场景标准、侧重速度的专用算法,以及其他。
3提炼将这6类归纳为在特定应用中选用某种哈希函数的3个核心原因。
1凝结用一句话解释固定长度的摘要如何实现对任意大小数据的验证。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。