什么是数字签名(ECDSA)?
数字签名是区块链、数字身份认证和安全通信的核心技术之一,ECDSA(椭圆曲线数字签名算法)是目前最常见、最主流的数字签名算法之一,尤其在区块链系统(如比特币、以太坊、EOS)中广泛应用。
一、什么是数字签名?
定义:
数字签名是一种基于非对称加密的机制,用于确认“数据的来源真实性”和“内容未被篡改”。
它是数字世界里的“签字+盖章”,具备以下两个作用:
- 证明身份(谁签的)
- 证明完整性(没改动过)
二、数字签名的工作原理
以 ECDSA 为例(非对称加密):
签名阶段(由发送者操作)
1. 使用哈希函数对原始消息计算摘要(如 SHA-256) → Hash(M)
2. 用发送者的私钥对 Hash(M) 做签名 → 签名(signature)
验证阶段(由接收者操作)
1. 接收消息和签名
2. 对消息重新做哈希 → Hash(M')
3. 使用发送者的公钥验证签名是否匹配 Hash(M')
若验证成功,则说明:
- 消息来自该私钥持有者(身份合法)
- 消息内容未被篡改(完整性)
三、什么是 ECDSA(Elliptic Curve Digital Signature Algorithm)
定义:
ECDSA 是一种基于椭圆曲线密码学(ECC)的数字签名算法。
相比传统 RSA,ECDSA 更短的密钥就能提供同等安全性,运算效率更高。
算法 | 安全性相当 | 公钥长度 | 签名速度 |
---|---|---|---|
RSA 2048位 | 高 | 长 | 慢 |
ECDSA 256位 | 同等甚至更高 | 短 | 快 |
应用场景:
- 比特币地址的签名与交易认证
- 区块链钱包(MetaMask、Ledger)
- SSL 证书(某些 HTTPS 网站)
- 数字身份认证、签约系统
四、ECDSA 签名过程(简化版)
- 生成密钥对(私钥 + 公钥)
- 用私钥对某条消息做 SHA-256 哈希,然后签名,生成
(r, s)
签名对 - 用公钥验证签名是否对应消息哈希
五、Java 示例:用 ECDSA 签名与验证
// 1. 生成密钥对
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
keyGen.initialize(256);
KeyPair keyPair = keyGen.generateKeyPair();// 2. 签名
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");
ecdsaSign.initSign(keyPair.getPrivate());
ecdsaSign.update("Hello blockchain".getBytes());
byte[] signature = ecdsaSign.sign();// 3. 验证
Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA");
ecdsaVerify.initVerify(keyPair.getPublic());
ecdsaVerify.update("Hello blockchain".getBytes());
boolean isValid = ecdsaVerify.verify(signature);System.out.println("验证结果:" + isValid);
六、ECDSA 在区块链中的作用
区块链环节 | 说明 |
---|---|
钱包生成 | 钱包地址 = 私钥生成的公钥哈希 |
交易签名 | 用私钥签署交易,广播前验证身份 |
节点通信 | 节点间身份认证使用签名机制 |
合约调用 | 部分区块链平台支持签名验证授权调用 |
七、数字签名 vs 哈希 vs 加密
技术 | 用途 | 是否可还原数据 |
---|---|---|
哈希 | 固定摘要、不可逆 | ❌ 不可还原 |
加密 | 保密传输,可还原 | ✅ 可解密还原 |
签名 | 验证身份和完整性 | ❌ 只验证,不解密 |
总结
项目 | 描述 |
---|---|
定义 | 用私钥签署、用公钥验证,确保身份 + 内容完整 |
算法 | ECDSA = ECC + SHA256 |
特点 | 签名短、安全性强、广泛用于区块链 |
场景 | 钱包签名、交易授权、合同签署、节点认证 |