我们使用手写签名来进行自我识别,原因有两个:它们应当是可验证的,而且无法伪造。
当你想要确保计算机上的软件副本是真实的,且没有被以任何方式修改时,同样的原则适用。开发人员会在软件包上留下数字签名(无法被伪造),客户在安装软件前要在其副本中对该签名进行验证。
数字签名的目的是完成和手写签名相同的两项工作,不过它们实际的工作方式却大不相同。创建和验证数字签名需要一些非常聪明的加密技巧。
如何在众目睽睽之下隐藏秘密消息
一个聪明的办法是用‘密钥’来锁定和解锁这个共享的秘密。请允许我解释一下。
你和你的朋友都认可一个密钥,然后你用这个密钥把你的秘密消息转换成乱码。
然后,您会拿到您的消息,并根据密钥替换其中的每个字母。因此,消息“SECRET”会变成“TFDSFU”。您在便签上写下“TFDSFU”并将其留在公共空间。您的朋友可以解码,因为他们拥有您之前交换的密钥。所以他们所要做的就是把“TFDSFU”中的每个字母往后移动一个位置,他们就会得到原始消息“SECRET”。任何窃听者只会看到无意义的内容,因为他们首先需要密钥才能理解消息。
我们刚才描述的是一种非常简单的加密技术,它使用的密钥是基本的凯撒密码。
计算机如何通过互联网发送秘密消息
现在想象一下,如果您在互联网上做同样的事情,并且希望您的通信完全安全。在现实世界里,您可以提前碰面并相互交换密钥。您不能像在现实世界那样在互联网上交换密钥,因为互联网是一个公共空间。那么,如何在不与您的朋友共享的情况下交换密钥?
因此,您需要一个密钥来安全通信,但您首先需要安全地传达密钥。这就是如何让两台计算机在不通过互联网发送该密钥的情况下就同一密钥达成一致。
通俗点儿说,加密使用的数学方程在一个方向上容易求解,但在相反方向上极其困难(甚至不可能)求解。因此,如果一台计算机拥有带有所有正确数字的方程,它可以轻松求解。但是,如果给定解决方案,它将无法对该方程本身进行逆向工程。
我在这儿做了大量简化,不然咱们得在这儿耗一整天。如果您想更深入地了解这是如何工作的,请研究Diffie-Hellman密钥交换。
以下是这种场景:有一个密钥被发送到公共空间(咱们称之为公钥)。计算机A又创建了一个密钥并将其保密(咱们就叫它私钥A)。计算机B也做同样的操作。
公钥每个人都能用,但私钥A和私钥B都安全地保存在各自的计算机上。
现在,计算机A取公钥并将其与自己的私钥组合以创建一个组合。计算机B用自己的私钥做同样的事情。这两个组合是不同的。计算机不是把私钥发送到公共空间,而是把这些组合发送过去。
记住哈,没法通过逆向工程这些组合来找到创建它们用的私钥。并且在任何时候,这两台计算机都看不到彼此的私钥。
现在来讲实际的技巧。每台计算机获取对方发到公共空间的组合。然后计算机A把它的私钥跟这个组合还有自己的私钥相加,得到最终密钥。另一台计算机用它的私钥做一样的操作,并且获得了跟计算机A生成的完全一样的最终密钥。
现在,两台计算机都有相同的密钥,它们可以使用该密钥对所有未来的通信进行加密和解密。以下这个答案太简化了:这两台计算机“弄”出了自己的密钥副本,实际上却没共享密钥本身。
这整个过程被称作公钥加密。
开发者如何在其代码中隐藏秘密签名
因此,开发者创建了一对私钥与公钥。记住,这两个密钥是不同的,不过它们在数学上有关联,并且不可能从一个密钥反向推导出另一个。
开发者使用他们的私钥给软件包进行加密。那个加密的副本只能通过他们已经在互联网上发布的公钥来解密。所以当你和我使用公钥来解密那个副本时,我们能够绝对确定它是由开发者发送的,因为只有他们拥有最初能够加密其软件包的私钥。
哈希使工作变得容易
好吧,所以我有点说谎了。实际上对整个软件包进行加密是不太实际的,因为这些文件可能会特别大。通过哈希函数还有另外一种聪明的办法来解决这个问题。哈希函数是数学公式,能够从任何大小的文件中创建出固定长度的数字和字母。
例如,一个SHA256哈希函数将接受任何文件并生成一个256位数字和字母的列表。如果该文件哪怕只改变了一位,它就会产生完全不同的结果。所以开发者会通过SHA256函数运行软件包来生成一个文本文件。并且他们不是对整个包进行加密,而是用私钥对这个文本文件进行加密(就像我上面解释的那样)。他们把加密的哈希文本附加到软件包上并发送给我们。
当你我收到软件包时,我们也会通过SHA256运行它,从而获得我们自己的哈希列表。然后,我们将使用开发人员提供的公钥对随软件包附带的加密消息进行解密。如果解密后的哈希列表与我们这边所生成的列表相匹配,我们就可以绝对确定这个包来自开发人员,并且没有被篡改。在传输过程中对包的任何篡改都会导致完全不同的哈希文本。这些文本文件被称为校验和。
谁来监督监督者?
这些证书具有法律约束力,我们可以在我们这边自行验证,以绝对确保我们获得了正确的公钥。
所有这些事都会在后台自动发生,因为计算机处理哈希运算、加密和验证事宜。我们只会看到一个对话框,询问我们是否允许安装应用或进行更新。要是应用未签名,操作系统会在安装前向我们发出警告。