我们在网上下载软件时,经常会看到"验证数字签名"的提示;签电子合同、做网银转账,背后也离不开数字签名。数字签名到底是什么?它怎么保证数据没有被篡改、确实是某个人签的?今天我们就把这个技术的底层逻辑讲清楚。
数字签名的核心思路其实跟现实生活中的手写签名很像——用来证明这份文件确实是我发的,而且内容没被改过。但手写签名容易被模仿、被复印,数字签名用密码学手段解决了这些问题。
它的技术基础是非对称加密。非对称加密有一对密钥:公钥和私钥。公钥可以公开给任何人,私钥必须自己妥善保管。这对密钥有个奇妙的特性:用公钥加密的数据,只能用对应的私钥解密;用私钥加密的数据,只能用对应的公钥解密。
数字签名的过程是这样的。发送方先对原始数据做一个哈希运算(比如 SHA-256),得到一个固定长度的摘要,这个摘要就像是数据的"指纹"——数据哪怕改一个字,摘要都会完全不一样。然后发送方用自己的私钥对这个摘要加密,加密后的结果就是数字签名。发送方把原始数据和数字签名一起发给接收方。
接收方收到后,先用发送方的公钥解密数字签名,得到摘要 A;同时对接收到的原始数据做同样的哈希运算,得到摘要 B。如果 A 和 B 完全一样,说明两件事:第一,数据在传输过程中没有被篡改(哈希值匹配);第二,这个数据确实是用发送方的私钥签的,因为只有对应的公钥才能解密成功(身份认证)。
这里有个关键点:私钥必须安全保管。如果私钥泄露了,别人就能冒充你签名。所以实际应用中,私钥通常存在硬件加密芯片或者专用的安全模块(HSM)里,不会以明文形式出现在普通文件系统中。代码签名证书、SSL 证书里的私钥管理都是非常严格的。
数字签名跟数字证书是配合使用的。数字证书是由可信的第三方机构(CA,Certificate Authority)颁发的,证书里包含了持有者的身份信息和他的公钥,并且这个证书本身有 CA 的数字签名。你验证签名时,先从证书里拿到对方的公钥,同时确认证书是 CA 签发的、没有被篡改。这样就形成了一个信任链。
实际应用场景非常多。软件发布时,开发者用私钥对软件包签名,用户下载后用开发者的公钥验证,确保软件没有被植入木马。电子合同平台用数字签名保证合同内容不可篡改、签署时间可追溯。区块链里,每笔交易都用发送方的私钥签名,全网节点用公钥验证,确保交易合法性。
常见的数字签名算法有 RSA、DSA、ECDSA。RSA 是最经典的,基于大整数分解的数学难题;ECDSA 是基于椭圆曲线的,同样安全强度下密钥更短、计算更快,现在用得越来越多。国密算法 SM2 也是基于椭圆曲线的,在国内政府和金融行业强制使用。
下一篇:没有了