想象这样一个场景:你收到一封来自朋友的信,信上写着“借我1000元”,落款处有他的亲笔签名。你怎么确定这封信真的是他写的?也许签名是他模仿的,也许信的内容被篡改过。但在现实生活中,我们有一套判断方法——比对笔迹、检查纸张、甚至打电话确认。
现在把这个场景搬到数字世界。你收到一封电子邮件,落款是“你的银行”,要求你点击链接更新密码。你怎么确定这封邮件真的来自银行?你怎么知道它没有被黑客篡改过?你怎么证明“我是我”?
这就是数字签名要解决的问题。
手写签名 vs 数字签名
手写签名是我们用来证明身份和表示认可的传统方式。它的特点是:
- 唯一性:每个人的笔迹不同,难以模仿。
- 不可否认性:一旦签了名,就不能反悔说“这不是我签的”。
- 与文档绑定:签名附在文档上,是文档的一部分。
但手写签名在数字世界里有天然缺陷:电子文档可以无限复制,签名也可以被剪切粘贴。你无法用肉眼判断一个电子签名是真是假。
数字签名就是手写签名的数字等价物,而且它比手写签名更强大。一个安全的数字签名必须具备:
- 身份认证:证明消息确实来自声称的发送者。
- 不可篡改:消息一旦被签名,任何修改都能被发现。
- 不可否认:发送者不能事后否认自己签过这个消息。
这些特性,正是密码学可以提供的。
数字签名如何工作?
数字签名是非对称加密的逆用。在非对称加密中,我们用公钥加密、私钥解密——任何人都可以用公钥加密消息发给私钥持有者。数字签名反过来:用私钥签名,用公钥验证。
具体过程是这样的:
- 发送者对消息计算哈希值,得到一段短小的摘要。
- 用私钥加密这个哈希值,生成数字签名。
- 把消息和签名一起发给接收者。
- 接收者用发送者的公钥解密签名,得到摘要1。
- 接收者对收到的消息计算哈希值,得到摘要2。
- 如果摘要1等于摘要2,说明消息确实来自私钥持有者,且未被篡改。
这个过程既验证了身份(因为只有私钥持有者才能生成可被公钥解密的签名),也验证了完整性(因为消息任何修改都会导致哈希值变化)。
数字签名的现实应用
你每天都在用数字签名,只是可能没意识到:
- HTTPS:网站服务器用数字证书向浏览器证明自己的身份,这个证书里就包含数字签名。
- 软件更新:操作系统和应用商店会用数字签名验证软件包的来源和完整性,防止恶意软件冒充。
- 电子合同:法务平台上签署的电子合同,背后是数字签名在提供法律效力。
- 比特币交易:每一笔交易都需要用私钥签名,网络中的节点用公钥验证,确保交易是你授权的。
这一章你将学到
在这一章,我们将深入数字签名的世界:
- 8.1 签名的类比:从手写签名到数字签名,用最直观的方式理解数字签名的核心思想。
- 8.2 RSA签名与ECDSA:两种最常见的签名算法,它们的原理、对比,以及各自的适用场景。
- 8.3 数字证书:公钥是公开的,但你怎么确定某个公钥真的属于某个网站?数字证书和PKI(公钥基础设施)如何构建起互联网的信任之网。
- 8.4 动手实验:用OpenSSL生成自己的数字证书,亲手体验签名的生成和验证过程。
准备好进入数字签名的世界了吗?让我们从那个最古老的问题开始:怎么证明“我是我”。