昨天和朋友碰了个头,然后做了交叉签署。

朋友签署完了,还没上传签署的时候。我手贱(幸好手贱)去server上update了一下我的key。结果发现多出一支key回来。

纳尼?

上pgp.mit.edu去搜我的邮箱,一堆key。我废弃过不少key,这就算了。有一支2014年签署的key引起了我的注意,因为ID和我的KeyID完全一致,UserID也一样。显然这是撞出来的,不过我不记得自己有做过这样的事情。

下面是我的真实key的fp:

2276 57F3 6E16 9B90 4186 2EBF 29A9 7386 0914 A01A

这是有问题的那支key的fp:

875D 447A E720 9037 84A0 7888 909F 2614 0914 A01A

可以看到,两者最后部分完全一致,这导致两者有同样的KeyID。

我点进去看了一下,后面一支key完全不是我的,签的情况也乱七八糟。但是UserID显然一致。然后汗毛一竖赶紧通知朋友。朋友看了一眼,果然签错成那支假的了。

我擦,我给你写我的fp是签名留念用的吗?

一般来说,签名很难吊销。他要是签错了,那就麻烦大了。幸好他没上传。整个删除后重新签署,这个问题总算是顺利解决。

我继续追踪,发现有趣的事来了。

这个key被很多人签署,其中有个人和我的签署人KeyID和UserID又和我互相签署的某人一致。这相当于攻击者不但碰撞伪造了我和他的外观一样的Key,而且连我们的互相签署关系都伪造出来了。。。

我OO了个XX的,这是想干嘛?

然后,某位朋友给了我这个站点:Stop it with those short PGP key IDs!

里面提到了这种伪造碰撞的现象。

同时,里面也提到了解决方法。

首先,向你的gpg.conf里面加入keyid-format 0xlong,这样可以使你的ID变为64位的长ID。碰撞难度更高,当然,也更难一眼看明白谁是谁。

其次,在写程序的时候,不要使用ShortID来指明身份了,因为这种方法显然受到了攻击。继续使用ShortID可能为你程序未来的安全性埋下隐患。

最后,验证fp的时候一定要用纸质传递,签署的时候一定要验证完整fp。

验证fp的时候一定要用纸质传递,签署的时候一定要验证完整fp。

验证fp的时候一定要用纸质传递,签署的时候一定要验证完整fp。

因为很重要所以说三遍。