1.名字中是什么
前面的例子说明产生一个密钥是多么容易,同时说明把任何一个名字放到密钥中多么容易。
这个例子说明使用名字 “Ruth Thomas
PGP为你提供了许多命名密钥的方法。你要知道每一个不同的名字应当如何使用。你可以用任何一个名字产生密钥,这个名字在密钥中称为userid。
一个密钥可以有多个userid。一般说来,userid的形式是Real Name
因为可以把同一个密钥用于多个地址,你可能要在同一个密钥中放进多个名字,表示它可以用于多个站点。你可以使用PGP把userid添加到你自己的密钥中,以编辑密钥环。
如果Ruth 想要在他的另一个电子邮件地址
PGP的每一个密钥都有另一个你无法控制的名字:keyid。密钥的keyid是一个数字串,这个数字串通过密钥参数获得,由PGP内部使用以便访问处理中的密钥。根据设计,想要让keyid一定程度上模仿实际的钥匙,但是实际上每个密角的keyid都不同。
keyid是一个64位量,但是只给用户用十六进制格式打印出32位。无论PGP什么时候需要userid,keyid都可以用在它的位置上。要向PGP标识一个串是keyid,必须在它的前面放字符串“0x”,表示这是一个十六进制串。Ruth的密钥也可以称为0xD0C6326D.
keyid的问题是它现在是公钥模数最低的64位。有一种很有名的攻击,有人可以产生另一个不同长度的密钥对,但是keyid和userid却和你的一样。如果检查不细致,很难辨别你使用的是哪一个密钥,而且无法告诉PGP你想要哪一个密钥,因为PGP只能牵引userid和keyid。
不幸的是,现在对这种攻击还没有一种防范措施。将来的PGP版本可能要处理这种情况。
因为使用同样的密钥ID创建新密钥相对容易,从而引起了密钥安全指纹的需要。这个密钥安全指纹是唯一的、不能很容易地伪造。这个值可用来作为密钥验证串;如果userid、keyid密钥大小和指纹都符合的话,那么用户就能确信他有正确的密钥了。密钥指纹是可信任的,因为密钥指纹是使用同一个散列算法得到的。这个算法就是MD5,PGP用它来保证消息的完整性。
然而,匹配一个密钥数字值并不足以相信这处密钥。检查密钥中的名字也很重要。任何人都可以创建一个密钥,并且说它属于总统;然而,任何这样的密钥属于总指挥部都是极不可能的。因此,你作为用户,必须使用其他方式证实密钥中的名字。在“Web的受托性”部分将介绍如何验证一个密钥。
2.PGP密钥环
PGP要求用户保持一个密钥的本地缓存。这个缓存被称为用户的密钥环。每个用户至少有两个密钥环:公钥环和私钥环。每个密钥环都用来存放用于特定目标的一套密钥。然而保持这两个密钥环的安全性很重要;如果有人窜改公钥环,就会使你错误地验证签名或者给错误的接收者加密消息。
(1)公钥环
公钥环为所有与你通信的各方存放公钥、useris、签名和信任参数。无论PGP什么时候要查找密钥来验证签名或加密消息,它都会到你的公钥环中去查找。这意味着你要让公钥环保持最新,即可以通过频繁地公报来完成,也可以通过访问PGP公钥服务器来实现。
信任参数存放在公钥环中,因此人与人之间不可能共享密钥环。而且,PGP不能正确处理多个密钥环,因此使用当前的版本创建一个站点范围(site-wide)的密钥环并不容易。
这是PGP中一个很有名的故障。等到在将来的版本中支持了多个密钥环,他布密钥最好的办法是使用密钥服务器。有关公钥环的一个安全性问题是一个被损坏的公钥环可能会导致错误的签名验证,更糟糕的是,还可能把消息发送给错误的对象。攻击者可以改变存放在公钥环的信任参数,或者改变存放在那里的实际密钥资料。这些攻击在“公钥环的攻击”部分将详细描述。
在设计密钥环的时候,只是想用它保存一些比较亲密的朋友和同事的密钥。很不幸,从当前的使用来看这种设计的假设有很大的局限性。许多人把他从来没见过甚至从来没联系过的人的密钥都放到密钥环国。这样就带来许多问题,主要是由于信息和复制和访问密钥环所需要的时间造成的。推荐的办法是保持密钥环尽可能小,当必要时从密钥服务器或站点级密钥环中取得密钥。
(2)私钥环
私钥环是PGP中存放个人私密的地方。当你产生一个密钥时,不能泄露的部分就存放在私钥环中。需要私下保存的数据被加密,因此对私钥环的访问不会自动允许对其秘密的使用。
然而,如果一个攻击者能够访问私钥环,那么他伪造签名解密消息的障碍就小多了。
因为私钥不在人们中间传送,用户的钥环中唯一可能的密钥就是他自己和私钥。因为私钥环受到通过短语的保护,简单的密钥环内容传送不允许对密钥资料的访问。
我们不推荐各方共享一个私钥,尽管有时可能有这种需要。尤其,当你拥有属于一个组织的私钥时,可能有必要让这个组织的多个成员都能访问这个私钥。这意味着任何个人都可以完全代表那个组织行动。
有时,拥有一个不带通过短语的私钥可能会有用。例如,建立一个带有私钥的服务器代表一群人。尤其,你可以运行一个经过加密的邮件列表,这个邮件列表的邮件服务器有它自己的密钥,而且有所有列表成员的公钥。列表成员用邮件服务器的密钥加密消息并把它发送给列表。列表处理解密消息,然后用相应列表成员加密的公钥重新消息。此时列表服务器可以和列表密钥签署消息,但这不是必须的。在这种情况下服务器进程需要访问一个私钥,这就需要密钥没有通过短语。
因为一个私钥环中可能有多个私钥,PGP有一个选项可以指定你想要使用的私钥的userid。
无论何时PGP需要选择一个私钥时,它都会选择密钥环的第一个密钥,这个密钥通常是最近创建的。你可以使用-u选项向PGP提供userid来修改它,这样PGP就会使用相应userid的密钥。
3.Web的受托性
据说,通过相应的媒介,在全球范围内一个人只要经过6次握手就能同另一个联系上。
这是一个介绍人的网络,每个人在链中都作为到另一个人的介绍人。PGP使用类似的方法介绍新的密钥,把密钥签名作为一种介绍形式。当某个人签署了一个密钥时,他就成为那个密钥的潜在介绍人。例如,假设Alice签署了Bob的密钥,而Bob签署了Charlie的密钥。
Alice现在就有了一个到Chrlie的证明路径。Alice现在有一种方式知道Charlie的密钥确实是Charlie的,因为上面有Bob的签名,而且Alice知道Bob的密钥确实是Bob的。这是一种在密钥中提供可传递的信任。
这个设计中有一个明显的问题。如果有人作为介绍人,但是并不真正知道他所介绍的人会怎么样呢?例如,如果Bob非常粗心,虽然签署了Doug的密钥,却宣称是Charlie的。不仅Bob认为这处密钥属于Charlie(尽管是Doug但却宣称它属于Charlie),而且因为对受托性没有一种度量,Alice也会相信。
这就是PGP信任网中所发生的。通过信任网(Web of Trust),用户定义了对一个密钥的信任量,作为介绍人。在前面的例子中,Alice给予Bob的密钥尽可能多的信任,而且如果他相信Bob正确地签署了其他人的密钥,他也会相信这个密钥。如果Alice知道Bob对于密钥验证很松懈,他就不会再信任Bob作介绍人了。其结果是,Alice不会再相信Bob为Doug签署的但宣称为Charlie的密钥。
当然,信任网也不是绝对安全。如果有人被欺骗签署了一个错误的密钥,它就会使得其他人错误地相信它。PGP信任网被认为是一个声誉系统,受到尊敬的人给出好的签名,其他人则给出不好的签名。当存在错误的声誉时,系统就可能失效。
4.信任程度
信任网开始于一个用户自己的密钥时。PGP假设如果你有密钥对中的一个私钥,你就可能相信它。这是因为你可以在任何时候通过创建并验证签名来论证密钥。这种情况称为终极信任(Ultimate Trust)。被一个终极信任密钥签名的任何密钥都被认为是有效密钥。
对于每一个有效的密钥,要求用户为这个密钥赋予一个信任级别。这个信任级值定义用户作为介绍人对这个密钥的信任程度。这样会引起混淆,因为PGP使用同一个术语定义对密钥有效性的信任和作为介绍人的信任量。一共有四种信任级别:
.完全信任(somplete trust)
.边缘信任(marginal trust)
.不信任(no trust)
.未知信任(unknown trust)
除了可以在密钥作为介绍人定义信任以外,用户可以在密钥中定义信任有效性需要的“完全”和“边缘”数量。在缺省的情况下,PGP需要一个完全签名或两个边缘签名。这里一个完全签名是使用一个介绍人完全信任的密钥的签名,边缘签名是使用一个介绍人边缘信任的密钥的签名。用户可以设置这些值,来定义需要多少完全和边缘签名才能信任一个密钥的有效性。
这个过程不断继续,直到达到用户定义的级别。在密钥环的搜索中,缺省值是循环或嵌套的4个级别。如果Alice为Bob签名,Bob为Charlie签名,Charlie为Dave签名,Dave这Elena签名,而Elena又为Frank签名,Alice距离Elena太远了,根本就不能信任Frank,困为中间隔的步数太多了。而且,这些都依赖于Alice对这根线上所有签名者的信任。一般说来,不推荐把信任放到你不认识的用户的密钥中。