九、数字签名——消息到底是谁写的

1 羊妈妈的认证

大灰狼把黑色的爪子伸进门缝,说道:
“我是你们的妈妈,快快开门吧!”
七只小羊回答道:
“不是不是,妈妈的手是白色的,你的手的黑色的,你不是我们的妈妈!”
听了小羊的话,大灰狼把它的爪子染成了白色,于是小羊们就被大灰狼的白爪子给骗了,便打开了门。
这是因为小羊们用来认证的“白色的手”是大灰狼也能够模仿出来的。
如果有一种“只有羊妈妈才能生成的信息”,那就可以实现更可靠的认证了吧。

2 本章概要

数字签名是一种将相当于现实世界中的盖章、签字的功能在计算机世界中实现的技术。使用数字签名可以识别篡改和伪装,还可以防止否认。

3 数字签名

3.1 Alice 的借条

假设 Alice 需要向 Bob 借 100 万元。不过 Alice 和 Bob 离得很远,无法直接见面。通过银行汇款, Alice 可以立刻从 Bob 那里收到钱,但是 Alice 的借条应该怎样发送给 Bob 呢?挂号信寄过去,但是会花费时间,能不能用电子邮件来发送借条呢?比如:
“Bob,我向你借款 100 万元。”————Alice。
显然,Bob 看到这封邮件也不会轻易相信,因为电子邮件容易被伪造也可能被篡改,或者事后 Alice 可以以“我不知道这张借条”为理由来否认。

3.2 从消息认证码到数字签名

1. 消息认证码的局限性

第八章介绍的消息认证码由局限性,即,无法防止否认,以及无法向第三方证明消息是对方发的。

2. 通过数字签名解决问题

假设 Alice 使用的秘钥是一个只有 Alice 自己才知道的私钥。当 Alice 发送消息时,她用私钥生成一个“签名”。相对的,接收者 Bob 则使用一个和 Alice 不同的秘钥对签名进行验证。使用 Bob 的秘钥无法根据消息生成签名,但是用 Bob 的秘钥却可以对 Alice 所计算的签名进行验证,也就是说可以知道这个签名是否是通过 Alice 的秘钥计算出来的。
实际上,这种看似神奇的技术,早就已经问世了,这就是数字签名(digital signature)。

3.3 签名的生成和验证

在数字签名技术中,出现了下面两种行为:

  • 生成消息签名的行为
  • 验证消息签名的行为

生成消息签名:由消息发送者 Alice 来完成。表明“我认可该消息的内容”。
验证数字签名:由消息接收者 Bob 来完成或者需要验证消息的第三方来完成,即验证者 Victor。

Alice 使用“签名秘钥”来生成消息的签名,而 Bob 和 Victor 则使用“验证秘钥”来验证消息的签名。数字签名对签名秘钥和验证秘钥进行了区分,使用验证秘钥是无法生成签名的。这一点非常重要。此外,签名秘钥只能由签名的人持有,而验证秘钥则是任何需要验证签名的人都可以持有。
这里和第五章的公钥密码很相似。实际上,数字签名和公钥密码有着非常紧密的联系,简而言之,数字签名就是通过将公钥密码“反过来用”而实现的。

3.4 公钥密码与数字签名


4 数字签名的方法

我们来介绍两种生成和验证数字签名的方法:

  1. 直接对消息签名的方法
  2. 对消息的散列值签名的方法

后者虽然复杂,但实际中我们一般都使用这种方法。

4.1 直接对消息签名的方法

发送者 Alice 要对消息签名,而接收者 Bob 要对签名进行验证。
Alice 需要事先生成一个包括公钥和私钥的密钥对,而需要验证签名 签名的 Bob 则需要得到 Alice 公钥。过程如下:

  1. Alice 用自己的私钥对消息进行加密。
  2. Alice 将消息和签名发送给 Bob。
  3. Bob 用 Alice 的公钥对收到的签名进行解密。如果不是 Alice 的私钥加密的密文,则无法用 Alice 的公钥正确解密。
  4. Bob 将签名解密后得到的消息与 Alice 直接发送的消息进行对比。

4.2 对消息的散列值签名的方法

与对消息签名的不同是, 这里的消息变成了消息的散列值。流程参考上图。

5 对数字签名的疑问

5.1 密文为什么能作为签名使用

疑问:为什么密文能够具备签名的意义呢?
解答:数字签名是 利用了“没有私钥的人事实上无法生成使用该私钥所生成的密文”这一性质来实现的。并非为了保证机密性,而是代表只有持有该秘钥的人才能够生成的信息
这样的信息一般称为认证符号(authenticator),消息认证码也是认证符号的一种,数字签名也是一样。

5.2 数字签名不能保证机密性吗

疑问:从流程图看到,消息没有经过加密就发送了,这样不就无法保证消息的机密性了吗?
解答:的确,数字签名的作用本来就不是保证机密性。关于密码和签名的组合方法,将在第十三章 PGP 详解。

5.3 这种签名可以随意复制吗

疑问:数字签名貌似可以轻易复制出相同内容,那还能用作签名吗?
解答:签名重要的是,特定的签名者与特定的消息绑定在了一起这一事实。无论将签名复制了多少份,“是谁对这条消息进行了签名”这一事实是不会发生任何改变的。签名可以被复制,但这并不代表签名会失去意义。

5.4 消息内容会不不会任意修改

疑问:消息和签名两者都是可以任意修改的,这样的签名还有意义吗?
解答:数字签名所要实现的并不是防止修改,而是识别修改。修改没问题,但验证签名会失败。

5.5 删除签名也无法“作废合同”吗

疑问:带有数字签名的借据只是计算机文件,将其删除也无法保证确实已经作废,因为不知道其它地方是否还留有副本。无法作废的签名是不是非常不方便呢?
解答:我们可以在消息中声明该消息的有效期并加上数字签名,例如公钥的证书就属于这种情况,将在第十章详解。

5.6 如何防止否认

严格来说,如果数字签名的声称这说“我的私钥被别人窃取了”,也是有可能进行否认的,将在第十章探讨。

5.7 数字签名真的能够代替签名吗

不能代替,而是共存。

6 数字签名的应用实例

6.1 安全信息公告

一些信息安全方面的组织会在其网站上发布一些关于安全漏洞的警告,那么这么警告是否真的是该组织所发布的呢?因此,人们可以通过公钥 可以排除有人恶意伪装成该组织来发布假消息的风险。

6.2 软件下载

保证网络下载的软件是否被篡改过。

6.3 公钥证书

在验证数字签名时我们需要合法的公钥,那么怎么才能知道自己得到的公钥是否合法呢?我们可以将公钥当作消息,对它加上数字签名。像这样对公钥施加数字签名所得到的就是公钥证书,将在第十章详解。

6.4 SSL/TLS

SSL/TLS 在认证服务器身份是否合法时会使用服务器证书,它就是加上了数字签名的服务器公钥。相对的,服务器为了对客户端(用户)进行认证也会使用客户端证书。将在第十四章详解。

7 通过 RSA 实现数字签名

7.1 用 RSA 生成签名

签名 = 消息 ^ D mod N

这里所使用的 D 和 N 就是签名者的私钥。

7.2 用 RSA 验证签名

由签名求得的消息 = 签名 ^ E mod N

这里所使用的 E 和 N 就是签名者的公钥。

7.3 具体实践

假设密钥对:
公钥:E = 5; N = 323;
私钥:D = 29; N = 323;

1.生成签名

消息^D mod N = 123^29 mod 323 = 157
得到签名是 157,向接收者发送的内容为:(123,157)。

2.验证签名

签名^E mod N = 157^5 mod 323 = 123
得到的消息 123 与发送者直接发送过来的消息 123 是一致的,因此签名验证成功。

8 其它的数字签名

  1. EIGamal 方式:利用了在 mod N 中求离散对数的困难度。
  2. DSA。
  3. Rabin 方式:利用了在 mod N 中其平方根的困难度。

9 对数字签名的攻击

9.1 中间人攻击

9.2 对单向散列函数的攻击

数字签名中所使用的单向散列函数必须具有抗碰撞性,否则攻击者就可以生成另外一条不同的消息,使其与签名所绑定的消息具有相同的散列值。

9.3 利用数字签名攻击公钥密码

将密文以邮件方式发送给可以解密者,诱导其帮忙解密。(博主认为,这属于社会工程学范畴)

10 各种密码技术的对比

10.1 消息认证码与数字签名

对称密码 公钥密码
发送者 用共享秘钥加密 用公钥加密
接收者 用共享秘钥解密 用私钥解密
秘钥配送问题 存在 不存在,但公钥需要另外认证
机密性 ✔️ ✔️
消息认证码 数字签名
发送者 用共享秘钥计算 MAC 值 用私钥生成签名
接收者 用共享秘钥计算 MAC 值 用公钥验证签名
秘钥配送问题 存在 不存在,但公钥需要另外认证
完整性 ✔️ ✔️
认证 ✔️(仅限通信对象双方) ✔️(可适用于任何第三方)
防止否认 ✔️

10.2 混合密码系统与散列值签名

在混合密码系统中,消息本身是用对称密码加密的,而只有对称密码的秘钥是用公钥密码加密的,即在这里对称密码的秘钥就相当于消息。
另一方面,数字签名中也使用了同样的方法,即将消息本身输入单向散列函数求散列值,然后再对散列值进行签名,在这里散列值就相当于消息。
即:对称密码的秘钥是机密性的精华单向散列函数的散列值是完整性的精华

11 数字签名无法解决的问题

用数字签名既可以识别出篡改和伪装,还可以防止否认。也就是说,我们同时实现了确认消息的完整性、进行认证以及防止否认。
然而,要正确使用数字签名,有一个大前提,那就是用于验证签名的公钥必须属于真正的发送者
现在由陷入了一个死循环,数字签名是用来识别消息篡改、伪装以及否认的,但是为此我们又必须从没有被伪装的发送者得到没有被篡改的公钥才行。
为了能够确认自己得到的公钥是否合法,我们需要使用证书。所谓证书,就是讲公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥。

但是这只是把问题转移了。为了对证书上施加的数字签名进行校验,我们必定需要另一个公钥,那么如何才能构建一个可信的数字签名链条呢?又由谁来颁发可信的证书呢?到这一步,我们就已经踏入了社会学的领域。我们需要让公钥以及数字签名技术成为一种社会性的基础设施,即公钥基础设施(Public Key Intrastructure),简称 PKI,关于证书和 PKI 将在第十章详解。

12 本章小结

本章介绍了,如何逆向使用公钥密码来实现数字签名,并使用 RSA 具体实践了数字签名的生成和验证。此外讨论了数字签名的攻击方法以及数字签名与消息认证码之间的关系。
通过数字签名可以识别篡改和伪装,还可以防止否认,但前提是用于验证严明的发送者的公钥没有被伪造。

13 小测验

  1. 要验证数字签名,需要使用签名者的私钥。
  2. RSA 可以用作数字签名算法。
  3. 使用数字签名可以保护消息的机密性,不用担心被窃听。