1.哈希函数
哈希函数是一种输入长度不定、输出长度固定的函数,广泛用于数据完整性校验、密码存储、区块链中的区块链接等。
1.1 哈希函数的性质
1.2 常见哈希算法
算法 | 输出长度 | 安全性现状 |
---|---|---|
MD5 | 128 位 | 已被破解,不安全 |
SHA-1 | 160 位 | 已被破解,不安全 |
SHA-256 | 256 位 | 仍然安全 |
SHA-3 | 224/256/384/512 位 | 目前安全 |
BLAKE2 | 256/512 位 | 速度快,安全性高 |
MD5算法已被破解,例图:
1.3 Merkle Tree(默克尔树)
Merkle 树是一种基于哈希函数的树结构,常用于数据完整性验证,区块链中的交易数据存储采用 Merkle 树。
Merkle 树的构造如下:
1.将交易数据分别进行哈希运算。
2.以配对方式对哈希值再次进行哈希,直到生成一个根哈希值(Merkle Root)。
3.只需存储根哈希,即可验证某个交易是否在区块中,无需存储完整数据。
示例:
Root
/ \
H12 H34
/ \ / \
H1 H2 H3 H4
在比特币区块中,Merkle 根用于证明一笔交易是否包含在某个区块里。
假设一个区块有 4 笔交易,Merkle 树结构如下:
Root = H12_34
/ \
H12 H34
/ \ / \
H1 H2 H3 H4
假设你要验证 H3 是否在树中,只需要知道:
1.交易的哈希值 H3。
2.同层的兄弟哈希 H4(用于计算 H34)。
3.上层的兄弟哈希 H12(用于计算 Root)。
通过如下计算:
1.计算 H34 = Hash(H3 || H4)
2.计算 Root = Hash(H12 || H34)
3.比对 Root 是否等于区块头中的 Merkle Root,即可判断 H3 是否在树中。
这样做的好处是:
1.节省存储空间,区块链上的轻客户端(如 SPV 客户端)不需要存储完整交易,只存 Merkle Root。
2.只需要下载根哈希,比直接下载整个区块更快,特别适用于移动设备或存储受限的节点。
3.如果交易数据被篡改,Merkle Root 也会变,保证了数据的不可篡改性。
1.4 HMAC(哈希消息认证码)
HMAC(Hashed Message Authentication Code)是一种基于哈希函数的消息认证机制,用于数据完整性和认证。例如,TLS 1.2 使用 HMAC-SHA256 进行消息完整性验证。
公式:
其中:
- ( K ) 是密钥
- ( M ) 是消息
- ( opad ) 和 ( ipad ) 是填充常数
认证流程:
1.发送方选择一个密钥K(双方预先共享)。
2.发送方通过公式,带入消息M来计算HMAC值
3.发送方发送消息M与HMAC值,如图:
4.接收方收到消息M后,带入消息M,使用相同的密钥K计算HMAC值
5.比较接收到的HMAC值和计算出的HMAC值
6.如果匹配,说明消息未被篡改,验证通过。
7.如果不匹配,说明消息可能被修改或密钥错误,验证失败。
这样做的好处是
1.攻击者即使拦截消息并修改内容,也无法伪造正确的 HMAC(除非他知道密钥)。
2.即使攻击者知道HMAC值,也无法反推出密钥K。
2. 公钥密码学
公钥密码学(非对称加密)使用一对密钥(公钥和私钥),广泛用于加密、数字签名和身份验证。
2.1 对称加密 vs 非对称加密
类别 | 加密方式 | 密钥 | 速度 | 应用 |
---|---|---|---|---|
对称加密 | 加密和解密使用相同密钥 | 需要共享密钥 | 速度快 | AES、DES |
非对称加密 | 公钥加密,私钥解密 | 公私钥对 | 速度慢 | RSA、ECC |
看一个对称加密的场景:
1.假设 Alice 想给 Bob 发送加密消息,她使用 AES 对称加密。
2.Alice 和 Bob 事先共享一个密钥 K(密钥必须保密)。
3.Alice 使用 AES 加密明文 M,得到密文 C
4.Alice 发送密文 C 给 Bob。
5.Bob 收到密文 C 后,使用相同的密钥 K 进行解密:
6.Bob 得到原始消息 M。
可以看到,对称加密的缺点是:如果密钥泄露,攻击者可以解密所有通信内容;不适用于身份认证,无法确认是谁发送的消息。
非对称加密使用一对密钥(公钥 + 私钥),虽然数据加密速度慢,但适用于安全通信和身份认证。流程如下:
1.假设 Alice 需要向 Bob 发送一条加密消息。
2.Bob 生成 RSA 公私钥对:
- 公钥 PK_B(公开给所有人)。
- 私钥 SK_B(只有 Bob 自己知道)。
3.Alice 获取 Bob 的公钥 PK_B。
4.Alice 使用 PK_B 加密消息 M,得到密文 C:
5.Bob 使用私钥 SK_B 解密 C,恢复明文 M
6.Bob 得到原始消息 M。
此时密钥泄露的可能降低,同时可以看出,非对称加密可用于身份认证(如数字签名)。
在实际应用中,可以使用非对称加密传输对称密钥,再用对称加密进行数据加密,典型的案例是HTTPS:
1.客户端(浏览器)使用服务器公钥加密 AES 密钥,并发送给服务器。
2.服务器用私钥解密,得到 AES 密钥。
3.后续通信使用 AES 进行对称加密,提高速度。
2.2 RSA 算法
RSA 是最早的公钥加密算法之一,基于大数因子分解问题。
RSA 加密流程:
2.3 ECC(椭圆曲线密码学)
ECC(Elliptic Curve Cryptography)是一种基于椭圆曲线数学的公钥加密算法,相比 RSA,提供相同安全性时,所需密钥更短,计算速度更快,因此广泛应用于区块链和现代密码系统。
基于 ECC 的数字签名算法:
- ECDSA(椭圆曲线数字签名算法):比特币和以太坊使用的签名算法。
- EdDSA:更快、更安全的数字签名算法。
2.4 Diffie-Hellman 密钥交换
用于在不安全信道上安全地共享密钥,区块链中的 P2P 加密通信常用该协议。
交换流程:
3. 常见的加密算法与协议
3.1 AES(高级加密标准)
AES 是最常用的对称加密算法,支持 128、192、256 位密钥。
其模式有:
- ECB(电子密码本)- 不安全
- CBC(密码块链接)- 需要 IV
- GCM(Galois/Counter Mode)- 高效且支持认证
3.2 TLS(传输层安全协议)
TLS 1.3 采用 ECDHE(椭圆曲线 Diffie-Hellman 交换)进行密钥交换,使用 AES-GCM 进行加密。
4. 区块链特有的密码学技术
4.1 Merkle Patricia Tree(MPT)
以太坊采用 MPT 存储账户状态,每次状态更新都会更新 Merkle 根,保证数据完整性。
4.2 多重签名(Multisig)
多重签名(Multisig,Multi-Signature) 允许一个交易需要多个私钥签名才能生效,提升安全性,常用于共享钱包、智能合约等场景。
N-of-M 签名模式:
- M:总共有 M 个授权方(持有私钥的人)。
- N:需要至少 N 个私钥签名才能执行交易。
例如,2-of-3 多重签名表示:3 个人持有私钥,但至少需要 2 人签名,交易才能生效。
比特币支持多重签名,交易流程如下(以 2-of-3 为例):
这样做的好处是:
1.共享钱包,实现公司账户或DAO组织的安全性,防止单点风险。
2.买卖双方将资金托管(Escrow)在第三方,确保公正交易。
3.即使一个私钥泄露,攻击者仍无法盗取资金。
4.3 环签名(Ring Signature)
环签名是一种群体签名技术,在一组公钥(混合了其他人的公钥)中,只有一个是真正的签名者,但无法区分是谁。
签名流程如下:
这样做的好处是:
1.外部观察者无法确定资金的真正来源。
2.去中心化匿名性,不依赖第三方。
3.即使攻击者分析链上数据,也无法还原真实交易路径。
4.4 zk-SNARKs(零知识简洁非交互式论证)
zk-SNARKs 是一种 零知识证明(Zero-Knowledge Proof)技术,在 Zcash 等隐私币中被用来保护交易隐私,确保交易有效性同时隐藏交易细节(如交易金额和发送方、接收方信息)。
特点:只有参与交易的双方知道具体的交易细节,第三方无法从区块链上获得任何信息。
工作原理:
5. 加密中的智能合约安全
5.1 Commit-Reveal 机制
前瞻攻击指的是在某些交易或竞拍环境中,恶意用户通过提前得知即将提交的交易或出价信息,在其之前进行自己的交易或操作,从而获得不公平的优势。例如,在一个去中心化交易所(DEX)中,攻击者可能会提前看到用户的交易订单,然后在交易执行之前先行交易,从而操控市场价格,获取额外利润。
Commit-Reveal 机制通过以下两步实现防止前瞻攻击:
1.提交(Commit)阶段
在提交阶段,用户在提交他们的实际交易数据或出价之前,会先提交一个加密哈希值(commitment),这个哈希值是通过哈希函数对交易数据进行加密处理得到的。例如,用户想要竞拍某项物品,先通过某个算法(如哈希)生成该竞拍信息的哈希值,然后将该哈希值提交到区块链上。哈希值本身并不暴露用户的真实意图或交易数据,因此即使其他用户看到这个哈希值,他们也无法知道具体的交易内容。这样就避免了恶意用户根据即将发生的交易进行前瞻攻击。
2.揭示(Reveal)阶段
用户在合适的时间(通常是经过一定的延迟)后,将其实际交易内容或出价公开。系统会将提交的哈希值与用户揭示的实际数据进行匹配。如果两者匹配,则证明该用户在提交阶段的承诺是合法且真实的。如果不匹配,则交易将被认为是无效的。
5.2 可验证延迟函数(VDF)
可验证延迟函数(Verifiable Delay Function, VDF) 是一种加密技术,旨在生成一个需要一定时间来计算的值,但一旦计算完成,任何人都可以快速验证其正确性。其主要特点是,它不仅要求计算时间延迟,而且这个延迟是不可并行化的,意味着必须按顺序逐步计算,无法通过并行处理来加速。
Sybil 攻击(女巫攻击)的成功通常依赖于节点能够快速而低成本地生成大量虚假身份,从而影响网络的共识过程。VDF 通过引入计算延迟,使得攻击者无法快速生成大量有效的身份或签名。攻击者必须消耗一定的时间来进行计算,这个过程对他们来说是昂贵且缓慢的,从而有效减少了攻击的可能性。