52

无处不在的数字签名

 5 years ago
source link: http://halfrost.com/digital_signature/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、为什么需要数字签名?

从上一篇文章里面我们知道,消息认证码可以识别篡改或者发送者身份是否被伪装,也就是验证消息的完整性,还可以对消息进行认证。但是消息认证码的缺陷就在于它的共享密钥上面。由于共享密钥的原因,导致无法防止抵赖。

数字签名就是为了解决抵赖的问题的。解决的方法就是让通信双方的共享密钥不同,从密钥上能区分出谁是谁。

二、什么是数字签名?

iMrUJju.png!web

数字签名相当于现实世界中的盖章、签名的功能在计算机世界中进行实现的技术。数字签名可以识别篡改、伪装、防止抵赖。

在数字签名中,有 2 种行为:

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

生成消息签名的人是由消息发送者完成的,也称为“对消息签名”。生成签名就是根据消息内容计算数字签名的值。

验证数字签名的人是第三方。第三方验证消息的来源是否属于发送者。验证结果可以是成功,也可以是失败。

数字签名对签名密钥和验证密钥进行了区分,使用验证密钥是无法生成签名的。签名密钥只能由签名人持有,而验证密钥则是任何需要验证签名的人都可以持有。

私钥 公钥 公钥密钥 接收者解密时使用 发送者加密时使用 数字签名 签名者生成签名时使用 验证者验证签名时使用 谁持有密钥? 个人持有 只要需要,任何人都可以持有

严格的来说,RSA 算法中公钥加密和数字签名正好是完全相反的关系,但是在其他公钥算法中有可能和数字签名不是完全相反的关系。

fEjAf2z.png!web

在公钥算法中,公钥用来加密,私钥用来解密。

YNnuAjV.png!web

在数字签名中,公钥用来解密(验证签名),私钥用来加密(生成签名)。

三、生成和验证数字签名

qIj6NvI.png!web

有两种生成和验证数字签名的方法:

  • 直接对消息签名的方法
  • 对消息的散列值签名的方法

1. 直接对消息签名的方法

aYFn6bY.png!web

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

ZnUJ3aU.png!web

比较上面 2 种方法,一般都会使用第 2 种方法。原因是因为第 1 种方法要对整个消息进行加密,而且是公钥密钥算法,非常耗时。利用简短的单向散列函数来替代消息本身。再进行加密(对消息进行签名),会快很多。

对上面的 2 种方法,有一些共性的问题进行解释:

  • 为什么加密以后的密文能够具备签名的意义?

    • 数字签名是利用了 “没有私钥的人就无法生成使用该私钥所生成的密文” 这一性质来实现的。生成的密文并非是用于保证机密性,而是用于代表一种 只有持有该密钥的人才能生成的信息 。所以私钥产生的密文是一种 认证符号(authenticator)
  • 上面方法 2 中消息没有加密就直接发送了,这样不就没法保证消息的机密性了么?

    • 数字签名本来就不保证消息的机密性。如果需要保证机密性,可以考虑加密和数字签名结合起来使用。
  • 签名可以随意复制么?

    • 数字签名代表的意义是 特定的签名者与特定的消息绑定在一起 ,数字签名虽然可以任意复制,但是它的代表的意义始终不变。
  • 提取出签名,组合任意消息和该签名,这样不就可以伪造签名者的意图了吗?

    • 数字签名会识别修改,验证者验证的时候会发现消息和签名的散列值不同,验证失败从而丢弃这条消息。
  • 能否碰撞攻击,同时修改消息和签名,达到骗过验证者的目的?

    • 实际上这种方式做不到。首先修改了消息以后,散列值会发生变化。再想拼凑合法的签名,其实是做不到的。因为没有私钥是无法对新的散列值进行加密的。
  • 数字签名签订了以后能反悔么?

    • 数字签名本来就是用来防止抵赖的,一旦签署以后,无法抵赖,不能撕毁合同。只能再创建一个声明消息,声明该公钥已经作废的消息并另外加上数字签名。

四、数字签名应用实例

eiIVNri.png!web

1. 安全信息公告

信息安全组织会在网站上发布一些关于安全漏洞的警告。由于这些信息需要被更多的人知道,所以没有必要对消息进行加密。但是需要防止有人伪装该组织发布虚假信息,这个时候只需要加上数字签名即可。这种对明文消息所施加的签名,一般称为 明文签名(clearsign)

UBzeMjU.png!web

2. 软件下载

为了保证下载软件的安全,不是恶意的病毒,软件作者会对软件加上数字签名。用户在下载完成以后,验证数字签名就能识别出下载的是不是被篡改过的软件。

3. 公钥证书

验证数字签名的时候需要合法的公钥,但是如何才能知道自己拿到的公钥是合法的呢?这个时候就需要把公钥作为信息,对它加上数字签名,得到公钥证书。关于证书的问题再下一篇文章里面详细分析。

4. SSL/TLS

SSL/TLS 在认证服务器身份的时候会使用服务器证书,服务器证书就是加上了数字签名的服务器公钥。

五、数字签名的实现方式

fQziyiI.png!web

这一章节简单的讲讲用 RSA 公钥算法和单向散列函数生成签名。

1. 用 RSA 生成签名

签名 = 消息^D mod N (用 RSA 生成签名)

上面的 D 和 N 就是签名者的私钥。签名就是对消息的 D 次方求 mod N 的结果。

2. 用 RSA 验证签名

由签名求得的消息 = 签名^E mod N (用 RSA 验证签名)

上面的 E 和 N 就是签名者的公钥。验证者计算签名的 E 次方并求 mod N,得到“由签名求得的消息”。将这个消息和发送者直接发过来的消息进行对比,如果一致就验证成功,不一致就验证失败。

六、其他几种数字签名

EvInaey.png!web

1. ElGamal 方式

EIGamal 方式是由 Taher ElGamal 设计的公钥算法,利用了在 mod N 中求离散对数的困难度。ElGamal 方式可以被用于公钥密码和数字签名。

2. DSA

DSA(Digital Signature Algorithm)是一种数字签名的算法。是由 NIST(National Institute of Standards and Technology,美国国家标准技术研究所)于 1991 年制定的数字签名规范(DSS)。DSA 是 Schnorr 算法和 ElGamal 方式的变体,只能用于数字签名。

3. ECDSA

ECDSA(Elliptic Curve Digital Signature Algorithm)是一种利用椭圆曲线密码来实现的数字签名算法。

4. Rabin 方式

Rabin 方式是由 M.O.Rabin 设计的公钥算法,利用了在 mod N 中求平方根的困难度。Rabin 方式可以被用于公钥密码和数字签名。

七、对数字签名的攻击

ZBjyeqb.png!web

1. 中间人攻击公钥

这里的攻击主要是攻击公钥。如何进行公钥之间的认证,还是需要使用公钥证书。

2. 对单向散列函数的攻击

对单向散列函数进行碰撞攻击,生成另外一条不同的消息,使其与签名所绑定的消息具有相同的散列值。

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

由于 RSA 和数字签名互为逆向操作。于是可以利用这一性质,对 RSA 进行攻击。让发送者对 RSA 密文进行签名(用私钥加密),就相当于是 RSA 中的解密操作。

防止这种攻击有几种方法:

  • 不要直接对任何消息进行签名,对散列值进行签名比较安全
  • 公钥密码和数字签名使用不同的密钥对
  • 绝对不要对意思不清楚的消息进行签名,就像在看不懂的合同上任意盖章

4. 潜在伪造

即使签名的对象是无任何意义的消息,例如随机比特序列,如果攻击者能够生成合法的数字签名(即攻击者生成的签名能够正常通过校验),这也算是对这种签名算法的一种潜在威胁。在用 RSA 来解密消息的数字签名算法中,潜在伪造是可能的。只要将随机比特序列 S 用 RSA 的公钥加密生成密文 M,那么,S 就是 M 的合法数字签名,由于攻击者是可以获取公钥的,因此对数字签名的潜在伪造就实现了。

为了防止这种情况,人们改良了 RSA ,开发出了新的签名算法,RSA-PSS(Probabilistic Signature Scheme)。RSA-PSS 并不是对消息本身进行签名,而是对其散列值进行签名,为了提高安全性,在计算散列值的时候还对消息加盐(salt)。

5. 其他攻击

对公钥密码的攻击都可以用于对数字签名的攻击,例如暴力破解私钥,尝试对 RSA 的 N 进行质因数分解等等

八、数字签名无法解决的问题

数字签名所用到的公钥密码中的公钥需要另外认证,防止中间人攻击。认证用于验证签名的公钥必须属于真正的发送者。

似乎陷入了一个死循环。数字签名用来识别消息篡改,伪装以及防止抵赖。但是我们又必须从没有被伪装的发送者得到没有被篡改的公钥才行。

为了验证得到的公钥是否合法,必须使用 证书 。证书是将公钥当做一条消息,由一个可信的第三方对其签名后所得到的公钥。

关于证书的话题,下一篇文章再继续展开。

Reference:

《图解密码技术》

SHA-3 wikipedia

GitHub Repo: Halfrost-Field

Follow: halfrost · GitHub

Source: https://halfrost.com/digital_signature/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK