跳转到内容

密码学/数字签名

来自维基教科书,开放的书籍,开放的世界

截至 2014 年,安装应用程序可能是人们使用数字签名的最常见方式。Android 和 iOS 都要求应用程序在安装之前进行数字签名。[1][2]

密码学通常用于提供有关消息的某种保证。这种保证可以是以下四种一般形式中的一种或多种。这些形式是消息的机密性完整性身份验证不可否认性。在公钥加密出现之前,密码学通常只用于提供机密性,即通信被加密以保持其内容的秘密。这种加密通常意味着发送者知道使用的方案和密钥,因此提供了一些基本的身份验证。现代数字签名在提供身份验证、完整性和不可否认性保证方面比传统的对称密钥加密方案要好得多。

数字签名依赖于公钥签名算法对消息进行签名的能力——使用私钥从消息生成签名。之后,任何拥有该签名的人都可以使用相应的公钥验证消息。(这使用与公钥加密和公钥解密相反的顺序来提供机密性——使用公钥加密,并且只能使用私钥解密)。但是,为了提供数字签名,签名者必须使用其私钥来签署他想要使用其私钥签署的消息——或该消息的某些表示——以便任何知道其公钥的人可以使用它来验证只有他的私钥才能签署该消息。

在正确实施中,有一些相关的细节。

首先,如果接收者没有签名者公钥的已验证副本,则签名本身毫无用处。虽然面对面交换该密钥可能是最好的方法,但这通常是不可能的。因此,许多公钥基础设施要求创建证书颁发机构,其公钥通过某种可信方法预先共享。一个例子是像 VeriSign 这样的 SSL CA,其证书由计算机制造商预先安装在大多数流行的浏览器中。CA 是所谓的可信第三方,它是所有参与加密通信的各方都信任的个人或组织。该组织的职责是保证其私钥的安全和秘密,并使用该密钥来签署其已验证的个人的公钥。换句话说,为了避免与您希望与之通信的每个人面对面交换密钥的麻烦,您可能会聘请可信第三方的服务,您已经拥有其公钥,以便与这些个人面对面交流。然后,第三方可以签署公钥并将其发送给您,这样您就可以获得已验证的副本,而无需面对面交换每个密钥对。签名本身的细节我们将在稍后讨论。

通过PGPGPG进行安全电子邮件传输的另一种常用方法被称为信任网络。信任网络类似于创建证书颁发机构,主要区别在于它不那么正式。与其创建一个组织来充当可信第三方,不如让个人签署他们已与之面对面会面的其他个人的密钥。以这种方式,如果 Alice 有 Bob 的密钥,而 Bob 签署了 Charlie 的密钥,那么 Alice 可以信任 Charlie 的密钥。显然,这可以在非常复杂的网络中扩展,但这种能力也是一个很大的弱点;网络中一个被破坏的个人——信任链中最薄弱的环节——会使其余部分变得毫无用处。

签名的实际实现也可能有所不同。人们可以通过使用其私钥对消息进行加密来简单地签署消息——它可以通过其公钥解密,并且有效加密的行为只能由该秘密密钥执行,从而证明其身份。但是,人们通常可能想要签署而不加密消息。为了在基本级别提供此功能,人们可以发送消息的两个副本,其中一个副本将被加密。如果读者想要验证他阅读的未加密消息是否有效,他可以解密副本并比较两者。但是,即使这种方法也很麻烦;它使每条消息的大小增加了一倍。为了避免这种缺点,大多数实现使用哈希函数来生成消息的哈希值,并使用私钥加密该哈希值。这提供了与加密副本几乎相同的安全性,但节省了空间。

许多早期对公钥签名算法的解释将公钥签名算法描述为“使用私钥加密消息”。然后,他们将公钥消息验证算法描述为“使用公钥解密”。许多人更喜欢将现代公钥密码系统描述为具有 4 个独立的高级功能——加密、解密、签名、验证——因为它们中的任何一个(如果适当地填充以避免选择密文攻击)都不能替代任何其他功能。[3][4][5][6][7][8][9][10][11][12]

华夏公益教科书