一旦 P2P 应用发展到一个引人关注的程度,信任和安全问题就出现了。在用户间互相了解的小型应用中,信任和安全很少会成为问题。可是,有用的 P2P 应用很少会保持这么小的规模。本文将探讨在 P2P 应用中的信任和安全问题,为您介绍使分布式应用中的信任成为可能的工具。
信任在每个具有一定规模的分布式应用(包括对等应用)中都是一个问题。在一个分布式应用中,信任的等级就是衡量我们确信程度的尺度,即我们正与之通信的人是否是我们以为的那个人,以及我们正访问的资源是否是我们以为的那些。
在实体间都互相了解的小型网络中,要建立信任是很容易的。在小型网络中,实体是建立在互相熟悉的基础上的,信任就可以由在真实世界中运作的同样的社会力量来维持。当一个网络应用扩展到常规的社会力量不再满足要求时,建立信任的难度就会变得大起来。网络的确切大小显然依赖于应用,但当网络中的任何实体不再只期望和认识的实体进行相互作用的时候,上述的扩展过程中的问题就出现了。
这里我们马上遇到了两个问题:对等的认证和授权。首先,实体不能再假定其他实体就是它们自己所声称的实体。这是认证问题。第二,实体不能再简单地允许其他实体不加选择地访问它们提供的功能和它们管理的资源。这是授权问题。
甚至在信任成为一个问题之前,我们就碰上了保密的问题。无论一个相互作用是在两个以前从没遇见过的实体间的,还是在两个老相识的实体间的,相关实体都必须保证他们间的相互作用是安全的。
关于信任,在许多 P2P 应用中,还有一个决定性的方面没有得到应有的重视。对等认证无疑是重要的,但通常同样重要的是对共享资源的认证 — 特别是内容。没有对共享内容的完整性和同一性的保证,一个 P2P 应用就会冒引入许多安全漏洞的风险,以至于 Microsoft Outlook — 从来不是一个安全的好示例 — 相比之下就会像 Fort Knox 一样。
信任在 P2P 应用中真的重要吗?虽然许多现存的 P2P 应用都是看起来运行如飞而却不严格地对待信任问题,我还是坚持认为在任何分布式应用中信任都是必须的 — 包括 P2P 应用。许多 P2P 应用所拥有的开放性并没有排斥信任,甚至都没有减弱它的重要性。
“在因特网上,没人知道你是一条狗”(Peter Steiner,The New Yorker 杂志),我肯定你们中的许多人对这个标题的那幅漫画很熟悉。这个说法所反映的事实准确地强调了把建立信任作为实体间的相互作用的第一步的重要性。要促进某种类型的 P2P 应用(电子交易应用是一个极好的示例)在一个自然匿名的媒介(例如因特网)上的使用,涉及的实体必须能够互相信任。匿名的面纱必须被揭开,从而让另一方暴露自己是一条狗(或至少是一条没有有效信用卡的狗)。
在涉及内容的管理和发布时 — 这是许多 P2P 应用的主要活动,信任也一样重要。只要是由相对不重要的音频和视频文件(它们的交换无需授权,也不花费代价)组成的内容,信任就不重要 — 您会得到您付钱所要的任何东西。可是,在一个付费的媒体或应用内容的发布系统中就不是这样。如果您付了钱,您就一定想得到货物 — “让顾客谨慎”可不够好。
对于那些把处理工作分发到分布式计算节点上,然后收集结果的 P2P 应用,信任可以成为一个严重的问题。证据是最近在 Seti@Home 分布式应用中一个组里的成员的欺骗行为。
要确保信任,一个网络应用和它的基础结构必须作出一些保证。首先,实体间的连接必须是安全的。基础结构还必须可以使以下条件成为可能:能够准确地识别其他实体,或至少能够肯定地断言这种识别是不可能的。最后,通过应用来管理或交换的资源也必须满足同样的要求。
虽然 P2P 领域可能看起来是令人激动的和全新的,但在分布式环境中安全计算的要素却还是原样。信任是通过综合以下三个标准要素来建立的:
1. 认证 决定某些实体实际上是否就是它们自称的人或东西的过程。在实际中,认证有两种形式。第一种形式涉及在一个网络(如因特网)中对等点向其他对等点认证它们自己。第二种形式涉及一个 P2P 应用的用户向该应用认证它们自己。在一些 P2P 应用中,这两者是一回事。
2. 授权 授予一个认证过的实体实施某些行为或访问某些资源的许可的过程。在一个 P2P 应用中,一个对等点可能被认证为只可以访问另一个对等点的部分资源。
3. 加密 把易理解的信息(明文)转化为一种对未授权的个人和系统来说难理解的形式(密文)的过程。解密是这一过程的逆过程。在一个 P2P 应用中,加密可以扮演许多角色。加密的一个明显的用途就是保护在一个不安全网络(如因特网)中的对等点间流动的信息。这与每个对等点的安全认证结合在一起,确保了交换数据不会在通信中被窃听。如果信息是被数字签名过的或在其中加入了 MAC (消息认证码),那么双方还能确定该信息没有被修改过。
您在下面的示例中将会看到,这三个要素被结合在一起创建了一个安全的分布式应用。
实际使用中的安全 为了更好地理解认证,授权和加密是怎样在一个 P2P 应用中帮助建立起对等点间的信任的,让我们看一下图 1 中的示例。请特别注意认证,授权和加密在其中扮演的角色。
图 1. 对等点 A 和 对等点 B 之间的操作顺序 在左边的对等点 A 希望和在右边的对等点 B 建立安全的通信:对等点 A 连接到对等点 B 并通告自己的身份。对等点 B 要求对等点 A 认证它自己。认证可以通过许多途径。如对等点 A 和对等点 B 都可以用一个共享密钥交换秘密的讯息,或对等点 A 可以使用对应于对等点 B 持有的公用密匙的私用密钥来完成同样的操作。
对等点 A 要求对等点 B 认证它自己。对等点 B 通过分配给对等点 A 特权的方式来授权对等点 A 访问某些资源。在进一步的通信发生之前,这两个对等点可以协商加密它们之间的通道连接。如果对等点 A 和对等点 B 没有相遇过,那么它们就必须依赖一个可以信任的第三方,对等点 C,来安排一个介绍,如图 2 所示:
图 2. 对等点 C 为对等点 A 和对等点 B 作介绍 这是介绍操作的顺序: 如上所述,对等点 A 开始与对等点 C 的安全通信。对等点 C 给予对等点 A 认证对等点 B 的必要信息。这可能包括对等点 B 的公用密匙,共享密钥或者一个可以启动通信的令牌或证书。对等点 B 开始与对等点 C 的安全通信并执行同样的操作。一旦该信息被传送完成,对等点 A 就可以开始与对等点 B 的通信了。还有别的机制也可以在两个对等点间建立起安全通信。上述方法遵循的是标准安全层次(如 SSL)所使用的模式。
如果您信任一个实体,您可能很理所当然地就信任了它提供的内容。在某些情况下,这种假设是合理的。如果被访问的内容包含了一些信息,而这些信息是有关信息来源的实体的,或者包含了来自于源实体提供的服务的信息,那么您信任该实体就足以让您信任您从该实体取得的内容。
另一方面,如果实体不是内容的来源,而是作为内容的一个缓存或中转站,比较明智的做法就是验证内容。某些种类的内容,比如活动内容(applets),就非常危险以至于验证是强制要执行的。有许多方法可以验证内容,包括简单的校验和,加密和水印技术。下面我将描述一个基于数字签名的机制。如图 1 所示,对等点 A 和对等点 B 建立了一个安全的连接。
在它建立好通道后,对等点 A 向对等点 B 要求一个内容。如果对等点 B 创建了该内容,它就会在传送该内容之前为其数字签名。如果对等点 B 只是发布在别处创建的内容,那么该内容是已经被签名过的。
在对等点 A 收到内容后,它将验证附在内容上的数字签名。对许多主流的应用而言,验证各种类型的内容已经是标准的操作过程。这同样也将成为 P2P 应用的标准操作过程。