Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
94 lines (52 sloc) 7.64 KB

OpenPGP 数字签名最佳实践

作者:M Salman Nadeem
发布于 2016-12-13
更新于 2019-04-17
译者:MDrights
原文:https://blog.mailfence.com/openpgp-digital-signature-best-practices/

在上一篇博文,我们讨论了 OpenPGP 加密的最佳实践。另一方面,数字签名也是 OpenPGP 一个重要的部分,高级和入门级用户都会用到它。在本文里我们来梳理在使用 openPGP 签名时的最佳实践。

什么是数字签名

数字签名一种数学计算过程用来确保以下的目的:

  • 验证发送者:消息/文件的发送者确定就是他/她
  • 完整性:消息在传送过程中没有被篡改
  • 不可抵赖:发送者无法否认某某消息是她/他发的

这技术能验证发送者并给到接收者很大的信心来信任消息的来源。

数字签名和验证的原理
一图说清数字签名和验证的原理
图片来源: https://wikipedia.org/wiki/Electronic_signature

签名始于对原始的消息进行简单的密码学哈希转换,再用发送者的私钥加密之,然后跟原始消息一起发送出去。

接收者接收到附带这个加密了的哈希的原始消息,把加密的哈希用发送者的公钥解密,然后把这串哈希跟原始消息的哈希进行比对。

好了你现在知道是怎么回事了!如果两串哈希值一致,就等于验证了(对方的)数字签名。

OpenPGP 数字签名最佳实践

下面就是一些你在实际给消息做数字签名时需要追求的最佳实践。

密钥创建和数字签名

  • 使用一个强劲的密钥用于数字签名。

要用4096位(或至少2048位)的私钥。Mailfence 默认生成 4096 位的RSA密钥。- 使用子密钥(sub-key)用于签名

在一台单独的机器上保护好你的密钥对可能并不容易,但你的设备总有可能被偷或丢失。加密和签名是两种不同的操作,因此也需要区别出两种不同的密钥管理方式。你可能需要让你的签名密钥有很长的有效期,这样过去的朋友仍然能验证你的签名。但对于你的加密密钥,你会希望尽快换成一对新的并能轻松地撤回/过期旧的密钥(当你旧密钥丢了时)。此外,最好生成一对密钥作为“主密钥”,保存到外部存储(比如,U盘),再用这对“主密钥”生成一对子密钥(sub-key)放在本地机器日常使用。

这里有篇好文章讲解了如何一步一步使用GnuPG工具创建子密钥。然后你可以把子密钥导入到 Mailfence 密钥仓库里并无缝地在你所有设备上使用。

注意:把主私钥保存在外部介质上会让GPG密钥验证变得有点麻烦,因为每次对别人的密钥做验证时都需要把主密钥导入到本地环境。此外,如果给子密钥设置了过期日期(推荐如此)的话,那子密钥必须在过期日前续期,要么就重新签发子密钥。还有,使用了你的公钥的人(比如,要验证一些你签名了的东西)会收到关于你的密钥已经过期的报错,如果他们不经常从公共密钥服务器上更新他们的GPG密钥串的话。

  • 叫你的朋友和同事对你的公钥签名

(互相之间)对公钥进行签名有助于增强每个人的私钥的正当性(译者注:意思是说为了让彼此信任的人的信任可以串成一系列信任链(即:web of trust),信任便可得到传递下去,而实现这个的方法就是信任的人之间互相给对方的公钥签名)。现在就叫你的朋友/同事给你的公钥做数字签名吧。你也要给他们的公钥签名。

另一个类似的方法是,用 keybase.io ——一个在线服务可以让你的身份和你的公钥匹配,这样他人就可以通过你的公钥找到你,或通过你在网站上留下的信息得到你的公钥。- 给每个外发的消息都进行签名!

是的,而且要把带时间戳的发送者和接收者的电邮地址包含在数字签名里!(再把你的数字签名放进邮件的正文里)你可以同时使用一个服务来提供足够的保护对付重放攻击(replay attacks)(比如 nonce, 会话token, 时间戳等等)。

  • 转发带数字签名的消息时要特别留心

我们来看个例子,Bob 把一封 Alice 写并签名了的邮件转发给了 Carol。那么对于收件人来说只有 Alice 的身份是能够确认的。Carol 不能以为转发了邮件的 Bob 是数字签名的所有者,或,是正确的发件人。除非,Bob 也对自己转发的邮件做了签名。 验证对方的数字签名

  • “尝试”预先获得发件人的密钥指纹!

如果可能,提前取得发送给你邮件的人的公钥的指纹!(最好是当面取得)——或者如果发件人是个名人,那么尝试做些搜索(比如去他/她的网站、博客、社交帐号、keybase.io 等等)或许能找到他/她的指纹。

  • 一定要总是确认消息发件人的密钥对的指纹!

自动化验证(把原始消息的哈希跟解密后的哈希进行匹配)当然好,但你仍不能免受冒充攻击,就是说一个攻击者可以创建一个假的某人身份给你发送消息并用一个假的密钥签名了(这个假的密钥并不是被冒充的发送者的密钥)。这样,要鉴别发送者的密钥只能通过验证他/她的密钥指纹来进行了。你要跟所有发送者确认他们各自的密钥指纹。

千万不要依赖密钥的短或长 ID!

  • 确保签名密钥没有被撤回或过期!

确保签名密钥没有被撤回或过期!这很重要!应用程序通常没有准确把这个通知给用户。

不过,如果签名了的密钥是在密钥过期或撤回之前进行签名的,这签名还是有效的。

  • 导出消息到本地时带上它的数字签名!

因为当今帐号被盗变得更常见了,重要消息最好能在本地保留一份。

此外,你还可以对本地保存的消息再次加密以增加安全性。

  • 数字签名的法律价值

数字签名也可以用来证明某人是特定信息的作者。然而数字签名的精确法律意义还要看该签名是在哪里生成的,以及当地的法律。

这篇文章很好地讨论了这一领域的议题。

当然,在法律场景里运用数字签名技术的话还有很多有争议的地方。一个争议会出现在签名者自己的私钥丢失的可能性。如何验证(鉴别)一个人的私钥的丢失是非主观的被偷走的,还是故意而为?

注:反过来说如果你在某些很反常的场景中不想出现令自己“不可抵赖”的可能性,那么就得去用基于「可否认的验证」技术了!

OpenPGP 数字签名现在是比较常用的了,因为它不需要你必须获得收件人的公钥。

注:如果你当前使用的邮箱帐号本身并不安全,那么以上的 OpenPGP 数字签名最佳实践是帮不到你的。(译者补充:这通常是对于直接使用邮件服务页面里的密钥签名功能的人来说的,因为任何人只要能登录你的邮箱界面就能直接使用你的私钥,进行签名等等操作。所以前提还是要保护你的邮箱帐号密码。若你使用密钥的方式跟邮箱本身是脱离的就还比较安全,如EnigmailMailvelope。)

You can’t perform that action at this time.