GPG 的工作原理

原文链接 http://www.pgpi.org/doc/pgpintro

The Basics of Cryptography

尤利烏斯·凱撒 给他的将军们发送信息的时候,他并不信任他的信使。然后他就把信里的所有字母都向后移3位, A 替换成了字母 D ,所有的 B 替换成 E 等。只有知道 “向后移动三个位置” 的人可以解密出他的信息。这就是著名的 凯撒加密算法

Encryption and decryption

无需经过特别处理就可以被读取和理解的数据称为纯文本数据或者明文。隐藏纯文本数据真实内容的方法称为 Encryption( 加密 ),加密后产生的不可读的乱码称为密文。通过加密过程你可以对你想要接受数据之外的人实现数据的保护,就算这个人得到了密文也无法知道真实的内容。将密文转换成明文或者纯文本数据的过程称为解密。图 1-1 描绘的就是这个加密解密的过程。

图 1-1 加密和解密

What is cryptography?

Cryptography( 密码加密学 )是一门用数学加密和解密数据的科学。密码学允许你储存一些敏感信息或者在不安全的网络( 比如因特网 )传输,信息出了默认的接受者外无法被其他任何人读取。

Cryptography( 密码加密学 )是数据安全的科学,Cryptanalysis( 密码破译学 )则是分析和破解安全交流的科学。传统的密码破译学是包括推理分析、应用数学工具、模式查找、耐心、决心和运气的有趣的组合。

Cryptology( 密码学 )包括Cryptography( 密码加密学 )和Cryptanalysis( 密码破译学 )

Strong cryptography
"There are two kinds of cryptography in this world: cryptography that will stop your kid sister from reading your files, and cryptography that will stop major governments from reading your files. This book is about the latter." (翻译大致为:这个世界上有两种密码加密:其一为防止你的妹妹读你的文件,其二是防止大部分政府读取你的文件。这本书是关于后者。)
           --Bruce Schneier, Applied Cryptography: Protocols, Algorithms, and Source Code in C.

PGP也是关于后者的一类密码加密。密码加密也可以是强加密或者弱加密,具体会在后面解释。加密的强度取决于将它转换成明文需要的时间和资源。强加密的结果是密文在没有适合的解密工具时非常难破译。到底有多困多难呢?这么说吧,把现在整个地球上的计算机性能和可用时间,就算是10亿台电脑每秒检查10亿次,那也是不可能在宇宙毁灭前破译出明文。

有人会想,那么,这种强加密在面对一个非常明确的密码破译时同样支持的很好。谁会真的这么说呢?没有人证明一个在今天确定的最强加密方法同样可以明天的计算性能下保持完好。不管怎样,PGP 实现的强加密方法是现在可选的最好的加密方案。警觉性和保护主义会更好的你,不管怎样要好于事后索赔。

How does cryptography work?

一个加密算法或者密码,是一种在加密和解密过程中的数学方法。一个加密算法是结合一个密钥,一个单词、数字、或者词组,去加密明文。使用不同的密钥加密相同的明文会产生不同的密文。 而加密的安全性完全取决于两点:加密算法的强度和对于密钥的安全性保护。

由一个加密算法加上所有可能的密钥和所有协议组成一个加密系统。PGP 就是一个加密系统。

Conventional cryptography(常规加密)

在常规加密算法中,也叫密钥或者对称加密,一个密钥同时用来加密或者解密。DES(数据加密标准)就是一个被美国联邦政府官方使用的常规加密系统的例子。图1-2 是常规加密的图示

图 1-2 是常规系统加密

Caesar's Cipher 凯撒密码

一个非常简单的传统加密算法的例子就是置换密码算法。置换密码算法就是将信息中的一部分替换成另外一其他的信息。通常会被应用在按字母表替换字母,典型的两个例子就是:午夜船长的密码解谜戒指,是一个你从小就拥有的戒指,和凯撒密码。在这两个两个例子中,加密算法是按照字母表偏移,密钥就是偏移的数字。例如,如果我们用凯撒密码的密钥(偏移量是3)加密 “SECRET” 这个单词,我们按照字母表向后偏移3位,然后我们就会得到一个从第三个字母(D)开始的新的字母表。
开始是ABCDEFGHIJKLMNOPQRSTUVWXYZ,然后我们得到DEFGHIJKLMNOPQRSTUVWXYZABC,D=A,E=B,F=C,其他同理。
使用这个规范,明文“SECRET”将被加密成“VHFUHW”。想要允许谁读懂这串密文,你只要告诉他密钥是3即可。

很显然按照今天的标准来看这是一个非常弱的加密算法,但是它对凯撒来说有用,而且它描绘了传统的加密的工作原理。

Key management and conventional encryption

传统的加密算法有一些好处,它非常快,它对那些不会传输到任何地方的加密数据特别有用。然而,传统加密独自做为一个指定的安全数据传播方式可能时代价可能是比较昂贵的,简单的体现在安全密钥的分发困难上。想象下你最喜欢的谍战片里的画面:一个人带着一个锁住的手提箱铐在他的或者她的手腕上。手提箱里是什么东西呢呢?它可能不是一个导弹发射密码、生物病毒方程式、或者一份入侵计划本身。它是用来解密加密数据的密钥。

如果一个发送者和接受者使用传统加密进行加密交流,他们必须在密钥上达成一致而且他们自己必须安全的保存它。如果他们在不同的物理位置,他们必须信任一个中间人、一个 Bat Phone(加密电话)、或者其他一些安全通讯媒介防止密钥在传输过程中泄漏出去。任何在传输过程中无意中听到或者窃听到这个密钥的人都可以读取、修改、和伪造所有的已经加密的信息,或者用那个密钥认证信息,从而证明信息时真的。从DES到午夜船长的加密指环,一直存在的问题就是:如何将密钥传递给接受者而不会被任何人拦截?

Public key cryptography 公钥加密

这个密钥分发的问题被公钥加密解决了,这个概念是由Whitfield Diffie 和 Martin Hellman 在1975年提出的。(现在有证据证明英国秘密服务在Diffie 和 Hellman 之前的几年就发明了它,但是一直做为军事秘密保存,而且并没有用它来做任何事情。 [J H Ellis: The Possibility of Secure Non-Secret Digital Encryption, CESG Report, January 1970])
公钥加密是一种使用一对密钥加密:一个用来加密的公钥和一个用来解密的相对应的私钥或者密钥的非对称加密系统。你向这个世界发布你的公钥,同时秘密保存你的私钥。任何人都可以用你公钥的拷贝加密信息,但是只有你可以读取信息。就算那个人你从来都没有见过。

公钥加密时不可能通过计算公钥得出私钥的,任何拥有公钥的人可以加密信息但是不能解密信息。只有拥有相对应的私钥的那个人才可以解密这个信息。

图 1-3 公钥加密

公钥加密的主要的益处是它允许没有任何安全管理经验的人进行安全信息交换。需要发送者和接受者通过安全通道分享密钥的历史一去不复返,所有的交流只需要公钥,私钥再也不需要传输或者分享。这里有一些公钥加密系统的例子:Elgamal(以它的发明者Taher Elgamal 命名),RAS(以它的发明者 Ron Rivest、Adi Shamir和Leonard Adleman命名), Diffie-Hellman(命名,同样是发明者),DSA,Digital Signature Algorithm(由 David Kravitz 发明)。

由于传统加密曾经是传达秘密信息的唯一可用手段,安全通道和密钥分发的代价使得它只被那些负担得起的团体使用,如政府和大银行(或者拥有密钥解密指环的孩子)。公钥加密技术是一项给普通民众带来强加密的技术革命。还记得之前在手腕处拷着公文包的快递员么?公钥加密把他从这项工作中解放出来了(也许是他的解脱)。

How PGP works PGP 工作原理

PGP 组合了包括传统加密和公钥加密的一些最好的功能。PGP 是一个混合的加密系统。当用户使用PGP加密明文时,PGP首先压缩这个明文。数据压缩节约了数据传输的时间还有磁盘的空间,还有最重要的,强化了加密方法的安全性。大多数的密码分析技术利用从明文中发现的规律去破解密文。数据压缩会削弱明文中的这些规律,因此大大的增强了抵抗密码分析的能力。(如果压缩文件太短或者压缩的效果不好,将会造成这些文件将不会被压缩。)
接下来 PGP 会产生一个会话密钥,这个密钥是一个一次性的密钥。这个密钥时一个从你的鼠标运动和键盘输入产生的一个随机数。这个会话密钥用在一个非常安全,快速的传统加密算法中去加密明文,产生的结果就是密文。一旦数据被加密,这个会话密钥就会被加密到接受者的公钥里。这个公钥加密了的会话密钥会随着密文一起传送给接收者。

图 1-4 PGP 加密的工作原理
解密就是一个逆向的过程。这个接受者PGP副本使用他的或者她的私钥恢复这个临时的会话密钥,然后PGP使用这个密钥去解密这个传统加密方式加密的密文。

图 1-5 PGP 解密原理
这个两种加密方法的混合体混合了公钥加密的便利和传统加密的速度。传统加密方法大概有公钥加密的1,000倍快。公钥加密反过来提供一个密钥分发和数据传输问题的解决方法。放在一起使用,在没有牺牲任何安全性的同时提升了性能和密钥分发。

Keys 密钥

密钥是加密算法用来生成一个特殊加密文本的值。密钥基本上都是非常,非常大的数字。一般用位(bit)来衡量密钥的大小;一个表示1024位的数字是异常巨大的数字。在公钥加密方法中,更大的密钥带来更安全的密文。
但是不管怎么样,公钥加密的密钥大小和传统加密方法的密码大小是完全不相关的。一个传统加密方法中的80位的密码相当于一个1024位的公钥的加密强度。一个传统加密方法的128位的密码相当于3000位的公钥。更大的密钥更安全,但是每个加密方法中使用的算法都非常不同的,这样的比较就像是拿苹果和橘子去比较。
因为公钥和私钥是存在数学上联系的,所以很难通过只给公钥来产生私钥;但是不管怎样总是可以通过足够的时间和足够的计算机性能来产生私钥的。这就将选择密钥的正确的大小;足够大保证安全性,又足够小保证快速高效变的尤为重要。另外,你还需要考虑到是谁可能想要读区这些文件,他们的决心到底有多大,他们有多少时间,还有他们拥有什么样的资源。
相对大的密钥将在一个相当长的周期内保证加密的安全性。如果你想要你的加密在很多年后依然有效,你就需要使用一个非常大的密钥。当然,谁知道用“明天”的更快、更高效的计算机找出你的密钥需要多久?曾经有段时间56-bit的对称加密被认为是非常安全的。
密钥被储存在加密的表单内。PGP 将密钥存储在你的盘的两个文件内;一个存储公钥,一个存储私钥。这文件被称为密钥链。当你使用PGP时,你特别的将你的接收者的公钥添加到你的密钥链内。你的私钥存储在你的私钥链内,如果你丢失了你的私钥链,你将无法在解密任何通过这个密钥链内的密钥加密的信息。

Digital signatures 数字签名

公钥密码学的一个主要好处是它提供了一种采用数字签名的方法。数字签名使信息的接收者能够验证信息来源的真实性,并验证信息的完整性。因此,公钥数字签名提供认证和数据完整性。数字签名还提供不可抵赖性,这意味着它可以防止发送者声称他或她实际上没有发送信息。这些功能是密码学的基础,甚至比隐私更重要。
数字签名与手写签名的目的相同。然而,手写签名很容易被伪造。数字签名优于手写签名,因为它几乎不可能被伪造,而且它证明了信息的内容以及签名者的身份。

有些人倾向于使用签名,而不是使用加密技术。例如,你可能不关心是否有人知道你刚把1000美元存入你的账户,但你确实想确定是与你打交道的银行柜员。

图1-6
说明了创建数字签名的基本方式。你不是用别人的公钥对信息进行加密,而是用你的私钥对信息进行加密。如果该信息能用你的公钥解密,那么它一定是来自于你。

Hash functions 哈希函数

上面描述的系统有一些问题。它很慢,而且会产生巨大的数据量--至少是原始信息的两倍。对上述方案的改进是在这个过程中加入了一个单向散列函数。单向散列函数接受可变长度的输入--在这种情况下,任何长度的信息,甚至数千或数百万比特--并产生一个固定长度的输出;例如,160比特。散列函数确保,如果信息以任何方式被改变,即使只是一个比特,也会产生一个完全不同的输出值。
PGP在用户要签署的明文上使用了一个密码学上很强的哈希函数。这将产生一个固定长度的数据项,称为信息摘要。(同样, 对信息的任何改变都会产生一个完全不同的摘要)。

然后PGP使用该摘要和私钥来创建 "签名"。PGP将签名和明文一起传输。收到信息后, 收件人使用PGP重新计算摘要, 从而验证签名。PGP可以对明文进行加密,也可以不加密;如果有些收件人对签名不感兴趣或者没有能力验证签名,那么对明文进行签名是很有用的。

只要使用安全的哈希函数, 就没有办法从一个文件中提取某人的签名并把它附加到另一个文件中, 或以任何方式改变已签名的信息. 已签署的文件中最微小的变化都会导致数字签名验证过程的失败。


图1-7. 安全的数字签名

数字签名在认证和验证其他PGP用户的密钥方面起着重要作用。

Digital certificates 数字证书

公钥密码系统的一个问题是,用户必须时刻保持警惕,以确保他们对正确的人的密钥进行加密。在一个通过公共服务器自由交换密钥是安全的环境中,中间人攻击是一个潜在的威胁。在这种类型的攻击中,有人发布了一个假的密钥,上面有用户预期接收者的名字和用户ID。加密给这个假钥匙的真正拥有者的数据--并被其截获,现在却落入了坏人之手。
在公钥环境中,至关重要的是,你要保证你加密数据的公钥实际上是预定接收者的公钥,而不是伪造的。你可以简单地只对那些亲手交给你的密钥进行加密。但是,假设你需要与你从未见过的人交换信息,你怎么能知道你有正确的钥匙呢?

数字证书,或称证明,简化了确定公钥是否真正属于声称的所有者的任务。

证书是一种凭证形式。例如,你的驾驶执照,你的社会安全卡,或你的出生证明。这些证书上都有一些识别你的信息和一些授权,说明其他人已经确认了你的身份。有些证书,如你的护照,是对你身份的重要确认,你不会想失去它们,以免有人利用它们来冒充你。

数字证书是一种数据,其功能很像实体证书。数字证书是包含在一个人的公开密钥中的信息,它可以帮助其他人验证一个密钥的真实性或有效性。数字证书被用来挫败用一个人的钥匙代替另一个人的钥匙的企图。

一个数字证书由三样东西组成。

  • 一个公开钥匙。
  • 证书信息。(关于用户的 "身份 "信息,如姓名、用户ID等。)
  • 一个或多个数字签名。

证书上的数字签名的目的是说明证书信息已被其他一些人或实体所证明。数字签名并不证明整个证书的真实性;它只证明已签名的身份信息与公共钥匙一起,或与公共钥匙相联系。
因此,证书基本上是一个带有一或两种身份信息的公开钥匙,再加上其他一些受信任的人的认可,是一个很好的印章。


图1-8. PGP证书的解剖图

Certificate distribution 证书分发

当需要与他人交换公钥时,就可以利用证书。对于希望安全通信的小群人来说,手动交换包含每个所有者的公钥的软盘或电子邮件是很容易的。这就是手动分配公钥,而且只在一定程度上是实用的。超过这一点,就有必要建立系统,提供必要的安全、存储和交换机制,以便同事、商业伙伴或陌生人在需要时进行交流。这些系统的形式可以是被称为 "证书服务器 "的纯存储库,也可以是提供额外的密钥管理功能的结构化系统,被称为公钥基础设施(PKI)。

Certificate servers 证书服务器

一个证书服务器,也叫acert服务器或钥匙服务器,是一个允许用户提交和检索数字证书的数据库。证书服务器通常提供一些管理功能,使公司能够维持其安全政策--例如,只允许存储那些符合某些要求的钥匙。

Public Key Infrastructures 公钥基础结构

公钥基础设施包含了证书服务器的证书存储设施,但也提供了证书管理设施(签发、撤销、存储、检索和信任证书的能力)。PKI的主要特点是引入了所谓的认证机构,即CA,它是一个人,一个团体,一个部门,一个公司,或其他协会,一个组织已经授权它向其计算机用户颁发证书。(CA的作用类似于一个国家的政府的护照办公室。)CA创建证书并使用CA的私钥对其进行数字签名。由于它在创建证书方面的作用,CA是PKI的中心组成部分。使用CA的公钥,任何想验证证书真实性的人都可以验证签发CA的数字签名,从而验证证书内容的完整性(最重要的是,公钥和证书持有人的身份)。

Certificate formats 证书格式

数字证书基本上是一个识别信息的集合,与公共密钥绑定在一起,并由受信任的第三方签署以证明其真实性。数字证书可以是多种不同格式中的一种。
PGP承认两种不同的证书格式。

  • PGP证书
  • X.509证书
PGP certificate format PGP 证书格式

一个PGP证书包括(但不限于)以下信息。

  • PGP版本号 - 这表明使用哪个版本的PGP来创建与证书相关的密钥。
  • 证书持有者的公开密钥 - 你的密钥对中的公开部分,连同密钥的算法。RSA、DH(Diffie-Hellman)或DSA(数字签名算法)。
  • 证书持有者的信息 - 这包括关于用户的 "身份 "信息,如他或她的姓名、用户ID、照片等。
  • 证书持有者的数字签名 - 也称为自我签名,这是用与证书相关的公共密钥的相应私钥进行的签名。
  • 证书的有效期 - 证书的开始日期/时间和到期日期/时间;表明证书何时到期。
  • 钥匙的首选对称加密算法 - 表示证书拥有者倾向于用哪种加密算法对信息进行加密。支持的算法有CAST、IDEA或Triple-DES。

你可以把PGP证书看作是一个带有一个或多个标签的公开密钥(见图1-9)。在这些 "标签 "上,你会发现识别钥匙主人的信息和钥匙主人的签名,它说明钥匙和身份是一致的。(这种特殊的签名被称为自我签名;每份PGP证书都包含自我签名)。
PGP证书格式的一个独特之处在于,一个证书可以包含多个签名。几个人或许多人都可以在钥匙/身份证明对上签名,以证明他们自己确信该公开钥匙肯定属于指定的所有者。如果你在公共证书服务器上查看,你可能会注意到某些证书,如PGP的创建者Phil Zimmermann的证书,包含许多签名。

一些PGP证书由一个公开密钥和几个标签组成,每个标签都包含识别密钥所有者的不同方法(例如,所有者的名字和公司的电子邮件帐户,所有者的昵称和家庭电子邮件帐户,所有者的照片--所有这些都在一个证书中)。这些身份的签名列表可能不同;签名证明了其中一个标签属于公钥的真实性,而不是证明钥匙上的所有标签都是真实的。(请注意,'真实性'是在其持有者的眼中 - 签名是一种意见,不同的人在签署钥匙前检查真实性时投入了不同程度的尽职调查)。


图1-9. 一个PGP证书

X.509 certificate format X.509证书格式

X.509是另一种非常常见的证书格式。所有的X.509证书都符合ITU-T X.509国际标准;因此(理论上)为一个应用程序创建的X.509证书可以被任何符合X.509标准的应用程序使用。然而,在实践中,不同的公司已经创建了他们自己的X.509证书的扩展,并不是所有的都能一起使用。

证书需要有人来验证公共密钥和密钥所有者的名字是否在一起。使用PGP证书,任何人都可以扮演验证者的角色。对于X.509证书,验证者总是一个认证机构或由一个CA指定的人。(请记住,PGP证书也完全支持使用CA来验证证书的分层结构)。

一个X.509证书是一组标准字段的集合,包含了关于用户或设备的信息和他们相应的公开密钥。X.509标准定义了哪些信息会进入证书,并描述了如何对其进行编码(数据格式)。所有X.509证书都有以下数据。

  • X.509版本号--这标识了适用于该证书的X.509标准的哪个版本,这影响了其中可以指定的信息。最新的是版本3。
  • 证书持有者的公钥 - 证书持有者的公钥,连同一个算法标识符,该标识符指定了该钥匙属于哪种加密系统以及任何相关的钥匙参数。
  • 证书的序列号--创建证书的实体(应用程序或个人)负责为其分配一个独特的序列号,以区别于其颁发的其他证书。这一信息有多种用途,例如,当证书被撤销时,其序列号会被放在证书撤销列表或CRL中。
  • 证书持有者的唯一标识符--(或DN--区分名称)。这个名字在互联网上是唯一的。该名称旨在整个互联网上是唯一的。一个DN由多个子段组成,可能看起来像这样。CN=Bob Allen, OU=Total Network Security Division, O=Network Associates, Inc., C=US (这些是指主体的通用名称、组织单位、组织和国家)。
  • 证书的有效期 - 证书的开始日期/时间和过期日期/时间;表示证书何时过期。
  • 证书颁发者的唯一名称 - 签署该证书的实体的唯一名称。这通常是一个CA。使用该证书意味着信任签署该证书的实体。(请注意,在某些情况下,如根或顶级CA证书,签发者会签署自己的证书)。
  • 签发者的数字签名 - 使用签发证书的实体的私钥进行签名。
  • 签名算法标识符 - 标识CA用来签署证书的算法。

X.509证书和PGP证书之间有许多不同之处,但最突出的是以下几点。

  • 你可以创建你自己的PGP证书;你必须向认证机构申请并获得一个X.509证书
  • X.509证书本身只支持钥匙所有者的一个名字
  • X.509证书只支持一个数字签名来证明钥匙的有效性

要获得X.509证书,你必须要求一个CA为你颁发证书。你提供你的公钥,证明你拥有相应的私钥,以及一些关于你的具体信息。然后你对这些信息进行数字签名,并将整个包裹--证书请求--发送给CA。然后,CA进行一些尽职调查,验证你所提供的信息是否正确,如果正确,则生成证书并返回。
你可以认为X.509证书看起来像一个标准的纸质证书(类似于你在完成基本急救课程后可能收到的证书),上面贴着一个公开密钥。它上面有你的名字和一些关于你的信息,还有向你颁发证书的人的签名。


图1-10. 一个X.509证书

今天,X.509证书最广为人知的用途可能是在网络浏览器中。

Validity and trust 有效性和信任

公钥系统中的每个用户都有可能将假钥匙(证书)误认为是真的。有效性是指对公钥证书属于其声称的所有者的信心。有效性在公钥环境中是至关重要的,因为你必须不断地确定某个特定的证书是否是真实的。
当你确信属于别人的证书是有效的,你可以在你的钥匙圈上的副本上签名,以证明你已经检查过该证书,它是一个真实的证书。如果你想让别人知道你给证书盖了章,你可以把签名输出到证书服务器上,让别人看到。

正如公共密钥基础设施一节所述,一些公司指定了一个或多个认证机构(CA)来表示证书的有效性。在一个使用X.509证书的PKI的组织中,CA的工作是向用户颁发证书--这个过程通常需要对用户的证书请求做出回应。在使用PGP证书的组织中,如果没有PKI,CA的工作是检查所有PGP证书的真实性,然后签署好的证书。基本上,CA的主要目的是将公共密钥与证书中的识别信息绑定在一起,从而向第三方保证采取了某种措施来确保识别信息和密钥的绑定是有效的。

在一个组织中,CA是验证的总负责人;是每个人都信任的人,在一些组织中,比如那些使用PKI的组织,除非是由受信任的CA签署,否则任何证书都被认为是有效的。

Checking validity 检查有效性

确定有效性的一种方法是通过一些人工程序。有几种方法可以做到这一点。你可以要求你的目标收件人亲自交给你一份他或她的公开密钥的副本。但这通常是不方便的,而且效率低下。
另一种方法是手动检查证书的指纹。就像每个人的指纹都是独一无二的,每个PGP证书的指纹也是独一无二的。指纹是用户证书的哈希值,作为证书的一个属性出现。在PGP中,指纹可以以十六进制数字或一系列所谓的生物识别词的形式出现,这些生物识别词在语音上有区别,用于使指纹识别过程更容易一些。

你可以通过打电话给钥匙的所有者(这样你就发起了交易),要求所有者向你读出他或她的钥匙的指纹,并将该指纹与你认为是真实的指纹进行验证,来检查证书是否有效。如果你知道主人的声音,这个方法是可行的,但是,你如何手动验证你不认识的人的身份?有些人把他们的钥匙的指纹放在他们的名片上,正是出于这个原因。

另一种确定某人的证书有效性的方法是相信有第三个人经过了验证。

例如,一个CA负责确保在颁发证书之前,他或她仔细检查,以确保公开密钥部分真的属于声称的所有者。任何信任CA的人都会自动认为由CA签署的任何证书是有效的。

检查有效性的另一个方面是要确保证书没有被撤销。欲了解更多信息,请参阅 "证书撤销 "一节。

Establishing trust 建立信任

你验证了证书。你信任人。更确切地说,你信任人们来验证其他人的证书。通常情况下,除非所有者把证书交给你,否则你必须听从别人的说法,认为它是有效的。

Meta and trusted introducers 元和受信任的介绍人

在大多数情况下,人们完全信任CA来确定证书的有效性。这意味着其他人都依赖CA为他们完成整个人工验证过程。这在一定的用户数量或工作地点数量上是没有问题的,然后CA就不可能保持同样的验证质量水平。在这种情况下,有必要在系统中增加其他验证者。

一个CA也可以是一个元引入者。元引入者不仅赋予了钥匙的有效性,而且赋予了他人信任钥匙的能力。类似于国王将他的印章交给他信任的顾问,以便他们能以他的权威行事,元介绍人使其他人能作为受信任的介绍人。这些受信任的介绍人可以验证钥匙,与元介绍人的效果相同。然而,他们不能创建新的受信介绍人。

元介绍人和可信介绍人是PGP术语。在X.509环境中,元介绍人被称为根认证机构(root CA),可信介绍人则是次级认证机构。

根CA使用与特殊证书类型相关的私钥,称为根CA证书

Trust models 信任模式

在相对封闭的系统中,如在一个小公司内,很容易将认证路径追溯到根CA。然而,用户必须经常与企业环境之外的人交流,包括一些他们从未见过的人,如供应商、客户、顾客、同事等等。对那些没有被你的CA明确信任的人建立信任线是很困难的。
公司遵循一种或另一种信任模式,它决定了用户将如何去建立证书的有效性。有三种不同的模式。

  • 直接信任
  • 分层信任
  • 信任之网
Direct Trust 直接信任

直接信任是最简单的信任模式。在这种模式下,用户相信一个密钥是有效的,因为他或她知道它来自哪里。所有密码系统都以某种方式使用这种形式的信任。例如,在网络浏览器中,根认证机构的密钥被直接信任,因为它们是由制造商运送的。如果有任何形式的等级制度,它就是从这些直接信任的证书中延伸出来的。
在PGP中,一个用户如果自己验证钥匙,并且从不把另一个证书设置为受信任的介绍人,就是使用直接信任。


图1-11. 直接信任

Hierarchical Trust 层次化的信任

在一个分层系统中,有一些 "根 "证书,信任从它们那里延伸出来。这些证书可能会认证证书本身,或者它们可能会认证证书,而这些证书又会认证一些链上的其他证书。把它看成是一棵大的信任 "树"。叶子 "证书的有效性是通过从它的认证者向后追踪到其他认证者,直到找到一个直接受信任的根证书来验证的。


图1-12. 分层信任

Web of Trust 信任之网

信任网包含了其他两种模式,但也增加了信任是在看者眼中的概念(这是现实世界的观点),以及信息越多越好的观点。因此,它是一个累积性的信任模型。一个证书可能被直接信任,也可能在某个链条中被信任,这个链条可以追溯到一个直接被信任的根证书(元介绍人),或者被一些介绍人群体所信任。

也许你听说过 "六度分隔 "这个术语,它表明世界上任何一个人都可以通过六个或更少的人作为中间人来确定与世界上任何其他人的某种联系。这就是一个介绍人的网络。

这也是PGP对信任的看法。PGP使用数字签名作为它的介绍形式。当任何用户签署另一个人的密钥时, 他或她就成为该密钥的介绍人。随着这个过程的进行, 它建立了一个信任的网络.

在PGP环境中,任何用户都可以充当认证机构。任何PGP用户都可以验证另一个PGP用户的公钥证书。然而,这样的证书只有在依赖方承认验证者是可信的介绍人的情况下才对另一个用户有效。(也就是说,只有当你认为我是一个受信任的介绍人时,你才会相信我关于其他人的钥匙是有效的意见。否则,我对其他钥匙的有效性的意见是没有意义的)。

在每个用户的公共钥匙圈上存储的指标是

  • 用户是否认为某个特定的钥匙是有效的
  • 用户对该钥匙的信任程度,即该钥匙的所有者可以作为其他人的钥匙的验证人。

你在我的钥匙副本上表明,你认为我的判断是否算数。这实际上是一个信誉系统:某些人被认为能提供好的签名,人们相信他们能证明其他钥匙的有效性。

Levels of trust in PGP PGP中的信任等级

对钥匙的最高级别的信任, 即隐性信任, 是对你自己的钥匙对的信任. PGP假定,如果你拥有私钥,你就必须信任其相关公钥的行为。任何由你的隐性信任的钥匙签署的钥匙都是有效的。

你可以给别人的公钥分配三个级别的信任。

  • 完全信任
  • 边际信任
  • 不信任(或不信任)

为了使事情变得混乱,也有三个级别的有效性。

  • 有效
  • 勉强有效
  • 无效

要把另一个人的钥匙定义为受信任的介绍人,你要

  1. 从一个有效的钥匙开始,这个钥匙要么是
  • 由你签署或
  • 由另一个受信任的介绍人签署的
  1. 设定你认为钥匙的所有者有权获得的信任程度。

例如,假设你的钥匙圈里有爱丽丝的钥匙。你已经验证了爱丽丝的钥匙,并且你通过签署它来表明这一点。你知道Alice是一个真正坚持验证别人的钥匙的人。因此,你以完全信任的方式分配给她的钥匙。这使爱丽丝成为一个认证机构。如果Alice签署了另一个人的钥匙, 它在你的钥匙圈上显示为有效。

PGP需要一个完全信任的签名或两个边缘信任的签名来确定一把钥匙是有效的。PGP认为两个边际签名等于一个完全签名的方法类似于商人要求提供两种形式的身份证。你可能认为Alice相当值得信任,也可能认为Bob相当值得信任。任何一个人都有意外签署假钥匙的风险,所以你可能不会完全信任任何一个人。然而,两个人都签署了同一把假钥匙的概率可能很小。

Certificate Revocation 证书撤销

证书只在其有效期内有用。简单地认为一个证书永远有效是不安全的。在大多数组织和所有PKI中,证书都有一个有限的有效期。这就限制了系统在发生证书泄露时的脆弱期。
因此,证书的创建有一个预定的有效期:一个开始日期/时间和一个到期日期/时间。预计证书在整个有效期内都是可用的(其寿命)。当证书过期时,它将不再有效,因为其密钥/识别对的真实性不再得到保证。(该证书仍然可以安全地用于重新确认在有效期内加密或签署的信息--然而,它不应该被信任用于未来的加密任务。)

在有些情况下,有必要在证书到期前使其失效,例如,当证书持有者终止与公司的雇佣关系或怀疑证书的相应私钥已被破坏。这就是所谓的废止。撤销的证书比过期的证书更可疑。过期的证书是不能使用的,但并不像被撤销的证书那样有被破坏的威胁。

任何在证书上签名的人都可以撤销他或她在证书上的签名(只要他或她使用创建签名的同一私钥)。被撤销的签名表明签名者不再相信公开钥匙和识别信息属于一起,或者证书的公开钥匙(或相应的私人钥匙)已被破坏。一个被撤销的签名应该和一个被撤销的证书一样重要。

对于X.509证书,鉴于证书上唯一的签名是使其首先有效的签名--CA的签名,因此撤销的签名实际上与撤销的证书相同。PGP证书提供了一个额外的功能,即如果你自己觉得证书被破坏了,你可以撤销整个证书(不仅仅是上面的签名)。

只有证书的所有者(其相应的私钥的持有者)或证书所有者指定为撤销者的人可以撤销PGP证书。(指定一个撤销者是一个有用的做法,因为通常是证书对应的私钥的口令丢失导致PGP用户撤销他或她的证书--这项工作只有当一个人能够访问私钥时才有可能。) 只有证书的签发者可以撤销X.509证书。

Communicating that a certificate has been revoked 告知证书已被废止

当证书被废止时,让该证书的潜在用户知道它不再有效是很重要的。对于PGP证书来说,传达证书已被废止的最常见方式是将其发布在证书服务器上,这样就可以警告可能希望与你通信的其他人不要使用该公钥。
在PKI环境中,废止证书的交流最常见的是通过CA发布的一种叫做证书废止列表(CRL)的数据结构来实现。CRL包含一个有时间戳的、经过验证的系统中所有已撤销的、未过期的证书列表。被撤销的证书只保留在名单上,直到它们过期为止,然后再从名单上删除--这样可以防止名单过长。

CA在某个定期安排的时间段向用户分发CRL(也可能在周期外,每当证书被废止时)。理论上,这将防止用户在不知情的情况下使用一个被破坏的证书。但是,有可能在CRL之间的一段时间内,使用一个新的被破坏的证书。

What is a passphrase? 什么是口令?

大多数人都熟悉通过密码来限制对计算机系统的访问,密码是一串独特的字符,由用户键入作为识别码。
口令是密码的一个较长版本,理论上是一个更安全的版本。口令通常由多个单词组成,对标准的字典攻击更为安全,在字典中,攻击者会尝试字典中的所有单词,试图确定你的密码。最好的口令是相对较长和复杂的,包含大写和小写字母、数字和标点符号的组合。

PGP使用口令对你的机器上的私钥进行加密。你的私钥在你的磁盘上被加密,使用你的口令的哈希值作为秘钥。你使用口令来解密和使用你的私钥。口令应该是你很难忘记的,别人很难猜到的。它应该是已经牢牢嵌入你的长期记忆中的东西,而不是你从头开始编造的东西。为什么?因为如果你忘记了你的口令,你就不走运了。如果没有你的口令,你的私钥就完全没有用处,而且什么也做不了。还记得本章前面的那句话吗? PGP是一种加密技术, 它可以使主要的政府不知道你的文件. 它肯定也会让你无法接触到你的文件. 当你决定把你的口令改成那个你永远也记不住的笑话的开头时, 请记住这一点.

Key splitting 钥匙拆分

他们说,如果一个秘密被一个以上的人知道,它就不是一个秘密了。共享一个私人密钥对就带来了这样的问题。虽然这不是一种推荐的做法,但共享一对私人密钥有时是必要的。例如,企业签名钥匙,是公司用来签署法律文件、敏感的人事信息或新闻发布稿以证明其来源的私人钥匙。在这种情况下,值得让公司的多个成员访问该私人钥匙。然而,这意味着任何一个人都可以完全代表公司行事。
在这种情况下,明智的做法是把钥匙分给多人,使超过一两个人必须提出一块钥匙,以便把它重新组合成可用的条件。如果钥匙的碎片太少,那么这把钥匙就无法使用。

一些例子是将一把钥匙分成三块,需要其中两块来重组钥匙,或者将它分成两块,需要两块都有。如果在重组过程中使用了安全的网络连接,那么钥匙的股东不需要实际在场就可以重新加入钥匙。