概述
你可能在电视剧中看到坏人威胁主角的时候会拿出作为人质的亲人写的信,而主角一看笔迹就知道是亲人所写的了。
在这里笔迹起到了两个作用:
- 证明信的内容确实是亲人所写
- 证明内容没有被篡改过
在计算机的世界中,我们同样需要对信息一样的验证。
例子
下面是一段在线聊天对话:
- 小明:小红,借我 30w 呗,我去买点水喝。
- 小红:可以,不过你要给我打一个欠条,拍照发过来。
- 小明:没问题,发给你了。
- 小红:好的,明天我把带给你。
此时,这笔借款交易的安全性如何?
- 小红可能会 PS 照片修改借款数字。
- 小明事后可能会抵赖说照片是修改过的。
- 照片可能在传输过程中阴差阳错地出现错误导致欠条内容改变。
- 其它。
这时需要解决的问题就是:
- 如何证明这个照片是小明发给小红的。
- 如何证明这个照片没有被修改过。
此时我们就需要对照片进行数字签名。
前置知识
哈希函数
哈希函数是可以将一段任意长度的信息转化为固定长度信息,这个固定长度的信息称为哈希值。
哈希函数有两个特点:
- 任何长度的原始信息经过哈希函数后都会变成等长度的信息。
- 一旦输入给给哈希函数的信息发生了改变(哪怕是一点点的改变),最终的哈希值就会面目全非。
下面我们用一种叫做`SHA256`的哈希函数举个例子:
原始信息:100000000000000 哈希值:7186c3316577cf7ee0568c6ff7f3227b5b3e4b498e7eabba4f6e3d908e2162f4 原始信息:100000000000001 哈希值:11d77ab50791e10caffb01cb6ff851f4929edfb0ad79808111d78182b0048540
结果很明显,仅仅做一点点改动哈希值都会发生巨大的变化。
非对称加密
非对称加密有两个密钥,一个称为私钥,一个称为公钥。
经过公钥加密的信息只能被相匹配的私钥解密,也就是说同一个公钥不能解密自己加密的信息。私钥加密的信息只有公钥可以解密,也就是说私钥不能解密自己的信息。同时也可以用公钥验证加密的信息是否是相匹配的私钥加密的。
数字签名
签名过程
- 小明自己生成一对公私钥。
- 小明计算出欠条照片的哈希值。
- 小明用私钥对哈希值进行加密形成签名。
签名的过程就完成了。此时小明需要将照片,公钥以及签名发给小红。
验证过程
- 小红用公钥解密签名得到照片的哈希值。
- 小红用公钥验证得到解密出来的哈希值确实是小明的私钥加密的。
- 小红计算出欠条照片的哈希值。
- 将两个哈希值进行对比,如果一样则验证成功,反之则失败。
可见验证成功需要同时满足两个条件:
- 解密出的哈希值与收到的照片的哈希值一致。
- 用公钥证明了哈希值确实是小明的私钥加密的。
第一个条件保证了照片没有被修改过。第二个条件则保证了借款双方都无法抵赖。
你可能会想,如果小明表示小红的公钥不是自己的,或者小红表示自己的公钥不是小明的岂不是还能抵赖?
证书机构
此时我们需要第三方来做公正。小明需要将自己的公钥交给证书机构,证书机构审核后会颁发证书,证明这个公钥是小明的。而且这个证书是公开的,也就是说小红也可以拿到。
此时假如抵赖小明说你的公钥是假的,那么小红就可以指着证书对他:说睁大你的X眼看看,这是你颁发给你的证书,上面已经说了这个公钥是你的。当小红抵赖的时候也可以这么干。
总结
数字签名可以切实有效地地保证双方的信息是没有被修改过的,并且可以明确消息来源。