当前位置: 首页 > news >正文

什么是数字签名(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 签名过程(简化版)

  1. 生成密钥对(私钥 + 公钥)
  2. 用私钥对某条消息做 SHA-256 哈希,然后签名,生成 (r, s) 签名对
  3. 用公钥验证签名是否对应消息哈希

五、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
特点签名短、安全性强、广泛用于区块链
场景钱包签名、交易授权、合同签署、节点认证

相关文章:

  • 非阻塞 IO
  • Java面试题030:一文深入了解MySQL(2)
  • 将文档转为数据集
  • FPGA内部资源介绍
  • tf serving和torch serve哪个耗时更低
  • 数据结构与算法总概
  • 鸿蒙 Grid 与 GridItem 深度解析:二维网格布局解决方案
  • 操作系统的概述之二
  • 探索钉钉生态中的宜搭:创建与分享应用的新视界
  • SpringMVC系列(六)(Restful架构风格(中))
  • 每日算法刷题Day40 6.27:leetcode前缀和3道题,用时1h20min
  • 鸿蒙5:布局组件
  • Linux环境安装Redis的多种方式分析
  • [Java 基础]LinkedList
  • 矩阵的条件数(Condition Number of a Matrix)
  • FPGA产品
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(二)- 职位数据清洗与预处理
  • 鸿蒙5:ArkTS基本介绍
  • Qt:QCustomPlot库简介
  • 短波电台和超短波电台的区别