數字簽名是區塊鏈、數字身份認證和安全通信的核心技術之一,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 |
特點 | 簽名短、安全性強、廣泛用于區塊鏈 |
場景 | 錢包簽名、交易授權、合同簽署、節點認證 |