一、概念
数字签名,又称公钥数字签名,是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
二、主要行为
- 生成签名
由消息的发送者完成,通过"签名密钥"生成 - 验证签名
由消息的接收者完成,通过"验证密钥验证"
三、如何保证签名的唯一性?
用消息发送者的私钥进行签名,然后任何接收者可以用公钥来验证签名。
数字签名,刚好跟公钥加密的方式相反,如下图所示:



四、数字签名的过程
示意图如下:

如上图所示,消息发送者Alice会发两份消息给接收者Bob,
- 第一份为明文发送
- 第二份消息用Alice的私钥加密后,再发送给Bob。Bob收到加密后的消息后,用Alice事先公开的公钥进行解密,得到第二份明文消息
- 比较两份明文消息是否一致
但是这种方法,存在一个问题:第二份密文消息数据量太大。比如Alice想发送一段100KB的消息,那么通过上述方式签名后,Alice还得发送100KB左右的密文消息。
那如何解决这个问题呢?改进方法如下:
**将第二份签名消息改为:发送时,先将明文消息进行md5得到一个哈希值,然后用私钥对哈希值再加密,发送给接收者;接收者收到消息后,先将明文消息做md5操作得到第一个哈希值,再将第二条消息用公钥进行解密,得到第二个哈希值,比较两个哈希值是否一致来验证签名,流程图如下:

网友评论