Digital Signature 数字签名

数字签名在加密领域是用来进行消息签名和验证消息签名的技术,目的是用来验证消息的真实性。

数字签名的应用非常广泛,特别是在金融领域(比如银行转账)。在加密货币领域,数字签名技术一般会用于转账交易,简单来说,比如A给B发送1个比特币,为了确保转账的真实性和安全,比特币转出方,会把交易信息做一个数字签名,来证明确实是由A转给B一个比特币,然后广播给全网。

数字签名是如何工作的?

首先数字签名依赖一个公钥加密系统,比如签名我们聊得RSA,也就是它需要有一对公钥私钥。签名和验证的基本过程如下:

mkdocs

签名过程(签名由私钥持有方发起):

  • 首先准备一个要发送的明文消息
  • 通过哈希算法,把这条明文消息转成哈希值
  • 使用私钥对这个哈希值进行签名
  • 把明文消息连同签名发送给公钥持有方

验证过程(公钥持有方进行签名验证):

  • 收到原始明文信息,对其进行哈希,取得哈希值H1
  • 通过公钥对签名消息进行解密,取得哈希值H2
  • 比较H1和H2,如果相等,则证明发送信息者,确实为私钥拥有方。

数字签名解决了什么问题?

假如A和B进行通信,A拥有私钥,B拥有公钥。

A通过私钥进行签名,发送给B,B通过公钥进行解密,验证签名。

整个过程可以确保A拥有的正确的私钥。 假如攻击者C冒充A给B发送消息,由于攻击者C没有A的私钥,所以它的签名在B那边是无法验证通过的。

数字签名没有解决什么问题?

数字签名只能证明对方确实拥有正确的私钥,但是却无法确保对方的身份,什么意思呢?这就要回到最初的Key exchange了。

假如A和B要进行通信,A有私钥,B有公钥,那首先要进行的是公钥分发,A把自己私钥所对应的公钥发送给B。但是很有可能中间会有攻击者冒充A,把自己的私钥所对应的公钥发送给B,B无法验证这个公钥的准确性,从而实现攻击。

要验证公钥的准确性,则需要引入另外一个非常重要的概念,数字证书(Digital certificate),这个我们后面会详细聊。

常用的数字签名算法

常用的数字签名算法有RSADSAECDSAEdDSA等。

下一节我们以RSA为例做演示,看看数字签名到底是如何具体工作的。