数字签名
假如你是李刚,那么该如何向别人证明你是李刚?现实中当遇到这样的问题,我们可能会拿出身份证,驾驶本等证件;也可能会通过接受预留手机的验证码;也可能会回答一些预设置的问题(小学4年纪的同桌,女朋友的生日等等…)。
数字签名其实就是要解决在计算机和网络世界,如何向别人证明一段数字信息是李刚发布的,这里就需要利用非对称加密的特点了:
第一步:李刚生成一对密钥对,将需要发送的信息经过HASH处理后生成对应的摘要(DIGEST1), 再把摘要用私钥加密,原文+加密摘要+公钥一起发送给其它人。
第二步:其它人接受到这些信息后,首先将加密摘要用公钥解密得到DIGEST1, 再用同样的HASH处理原文得到DIGEST2, 如果DIGEST1等于DIGEST2, 那么就可以肯定这段信息肯定来自于李刚。
OpenSSL实现
还是用ssh-keygen生产mykey密钥对,私钥是mykey,公钥是mykey.pub。
$ ssh-keygen -f ~/mykey
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/mykey.
Your public key has been saved in /root/mykey.pub.
The key fingerprint is:
SHA256:tTInYoRAlxD5K6xQpfud6atKRPm8bcUeKWTK+V/6pOA root@ecs-blog2.novalocal
The key's randomart image is:
+---[RSA 2048]----+
| .=+.. |
| .+o. |
| o+. + . |
| .o+.* . o . |
| o..*.+ S o |
|..+ .= = * |
|...o..=o. o |
|.. .o+o = |
| ...oE.+.. |
+----[SHA256]-----+
发送方生成签名, 将data.txt, mykey.pub, sigature.bin发送给接受方:
# 计算数据消息摘要:
openssl dgst -sha1 -out digest.txt data.txt
# 用发送方的的私钥给消息摘要签名:
openssl rsautl -sign -inkey mykey -in md.txt -out signature.bin
接受方验证签名:
# 计算数据消息的摘要,获得digest1
openssl dgst -sha1 -out digest1.txt data.txt
# 用公钥解密sigature.bin, 获得digest2
opensll rsautl -verify -pubin -inkey mykey.pub -in signature.bin -out digest2.txt
如果digest1 == digest2,那么就证明data.txt是来自发送方了。