信任网络(Web of Trust)是一个用于解决互联网上的身份信任问题。以 Linux Kernel 开发举例,我们没有办法判断某个补丁的创作者是不是可信任的,更严重的是,我们没有办法确认一个内核的维护者是我们之前认识的那个内核维护者。想象一下,有一天你突然收到了一封邮件,上面写着“我,Linus Torvalds ,打钱!”,你该如何确定这到底是不是 Linus ?
信任网络就是解决这种问题的,它依赖于 数字签名 技术,每个人都有一个私钥来签名,我们只需要找到对应的公钥就可以确定这个人是否持有那个私钥。比如我们现在有 Linus 的公钥,那么我们只需要检验那封匿名邮件上的签名,如果签名通过了,那么就说明这封邮件的作者就是 Linus 。
当然到这里问题并没有真正被解决,因为我们并不能确定我们手里的 Linus 公钥真的是 Linus 的公钥,有可能是别人的公钥。那么我们该怎么办?更加学术化的表述是,非对称加密 面临的一个主要挑战是密钥分发问题。也就是说,当你想与某人安全通信时,你需要确保你获得了对方的正确公钥,以防止中间人攻击(即攻击者冒充对方)。这个问题在没有可信任的第三方或验证机制的情况下尤其困难。
信任网络基于“六度分割理论”给出了解决方案。首先,Linus 的线下朋友肯定真的认识 Linus ,所以他们手里的 Linus 公钥肯定是真的。那这些线下朋友可以用自己的私钥来认证(也就是 sign) Linus 的公钥,他们告诉他们的朋友们这个公钥真的是 Linus 的公钥,所以 Linus 的朋友的朋友就拿到了真正的 Linus 的公钥,进一步,朋友的朋友的朋友也可以拿到真正的 Linus 公钥,如此迭代下去… 六度分割理论告诉我们,迭代六次全世界所有人都可以拿到 Linus 真正的公钥了。
不过这种方法也是有缺陷的:
- 它让人们在线下聚会的时候,需要不停的拿着自己的公钥交给别人去认证,非常麻烦;
- 已经位于信任网络中的恶意的人可以给一堆假公钥进行认证,这对于信任网络的破坏是非常大的。想象一下 Linus 的媳妇儿突然和公众说,其实你们看到的 Linus 是假的,真正开发代码的是 xxx ,我是他媳妇儿我还能说谎吗?大家会很难区分这种事情。
- 信任网络要求密钥长期存在(你和别人也不想天天更换自己的身份证吧),但是长期存在的密钥暴露的风险更高,而且向后兼容性维护的开销也很大。