哈希函数
哈希是什么
哈希函数: 将任意数据(二进制字符串)映射为固定长度"数字指纹"的单向散列函数,可用于验证数据完整性和保护敏感信息。
使用过程: 输入(任意长度数据) =>【黑盒函数(H: ${0,1}^{*} => {0,1}^{n}$)】 => 固定长度摘要(不可逆推)
哈希核心特性
- 单向性: 只有哈希过程,不存在可逆的解密过程,无法反向计算。
- 确定性: 相同输入即会得到相同输出,根据这点可进行重复验证。
- 高效性: 能够快速计算大文件或者长文本的哈希值。
- 固定长度输出: 不管文件与文本的大小,输出的固定字符长度都是相同的。
- 雪崩效应: 当输入改变
1 bit(轻微改变),输出平均改变约50%的位,且改变不可预测的。
哈希安全机制
-
抗原像攻击(
PreImage Resistance): 给定哈希值h,找到任意输入x使得H(x) = h是困难的- 攻击场景: 已知
hash = "a3b5c7d8.....",找到一个任意input使得H(input) = hash。 - 攻击难度: 需通过暴力尝试 $2^n$ 个可能性输入。例如,在
SHA-256的情况下,n=256。理论上可能,实际上无法实现。
- 攻击场景: 已知
-
第二原像攻击(
Second PreImage Resistance): 给定输入x1和H(x1),找到另一个x2使得H(x2)=H(x1)是困难的- 攻击场景: 已知
xx.pdf经计算后的hash = "x1y2z3...",需伪造evil-xx.pdf使得H(evil-xx.pdf) = "x1y2z3..." - 攻击难度: 需通过暴力尝试 $2^n$ 个可能性输入。
- 攻击场景: 已知
-
抗碰撞攻击(
Collision Resistance): 找到任意两个不同的输入x1 ≠ x2,使得H(x1) = H(x2)是困难的- 生日悖论: 在一个有23个人的房间里,有两人生日相同的概率>50%,365天只需要√365≈23人就有50%碰撞概率。
- 攻击场景: 在较少的尝试次数下,两组数据产生相同哈希值的概率可能比直觉预期要高。(生日攻击[
Birthday Attack]:只影响抗碰撞性。) - 攻击难度: 为了抵御生日攻击,现代哈希函数的输出长度通常至少为 256 比特(如 SHA-256),这样需要 $2^{128}$ 次尝试,这远超目前计算机的算力极限。即便使用量子计算机也需要$2^{\frac{256}{3}}$次尝试。
哈希的应用
核心问题:在不可信的环境中,如何高效验证大量数据的完整性和真实性?
| 应用场景 | 解决的问题 | 价值体现 | 使用算法 |
|---|---|---|---|
| 文件传输校验 | 网络传输中的数据损坏/篡改 | 用64个字符验证10GB等大文件 | SHA-256 |
| 密码存储 | 数据库泄漏导致密码暴露 | 不存储明文,无法反推 | bcrypt/Argon2 |
| 数字签名 | 文件来源和完整性证明 | 防止伪造和抵赖 | SHA-256 |
| 区块链 | 分布式账本防篡改 | 任何修改导致链断裂 | SHA-256 |
| 版本控制 | 代码变更追踪 | 每次提交唯一标识 | SHA -> SHA-256 |
| 数字去重 | 云存储空间浪费 | 快速识别重复文件 | MD5/SHA-256 |
哈希算法的价值 = 效率提升 × 安全保障
常用哈希算法(区块链)
SHA-256(比特币使用)
算法原理
安全性分析
Keccak256(以太坊使用)
与SHA-3的关系
为什么以太坊选择Keccak256
与SHA-256的对比
MD5 (不安全,了解)
SHA-1 (已被破解)
安全威胁
碰撞攻击(Collision Attack)
长度扩展攻击(Length Extension Attack)
-
原理(简述)
-
Keccak256的优势
生日攻击(Birthday Attack)
- 概率分析(简单提及)
数字签名
数字签名是什么
数字签名解决了哪三个问题?
为什么区块链必须用数字签名?
如果没有数字签名,区块链会有什么问题?
数字签名和密码有什么区别?
常见签名算法
ECDSA签名算法
理解ECDSA的基本原理和流程(不需要掌握数学推导)
- 什么是私钥、公钥、签名?
- 私钥和公钥有什么关系?能互相推导吗?
- 签名的过程是什么?(用自己的话描述)
- 验证签名的过程是什么?
- 为什么签名无法伪造?
签名的应用(概念)
理解以太坊如何使用签名(概念层面,不涉及Solidity)
以太坊交易是如何用签名保证安全的?
以太坊地址和私钥有什么关系?
除了转账交易,签名还能用来做什么?
EIP-191和EIP-712是用来解决什么问题的?
为什么说"私钥 = 银行密码"?
安全威胁
了解签名相关的主要安全风险,学会如何保护私钥
私钥泄露有哪些常见方式?如何防护?
什么是弱随机数攻击?为什么危险?
什么是签名重放攻击?以太坊如何防御?
什么是盲签名?如何避免被钓鱼?
如果你的私钥泄露了,应该怎么办?