缘起

物联网安全

之前对密码学一直提不起兴趣,近期准备构建一个支持端对端加密的物联网项目(基于home-assistant),在享受带来便利的同时,希望尽量避开偷窥者(多数是 AI)的视线, 目前几乎所有的物联网都是基于令人沮丧的云模式。周末花了一个早上阅读了端对端加密相关的东西,端对端加密的 Neverland 已上线。

由于最近关注端对端加密,读到很多有意思的东西,这个领域有很多有意思的人(多数是自由主义者),此前一直怕麻烦没有使用 GnuPG,一试之下,竟十分易用。

斯诺登的这句话说得真好:

Arguing that you don’t care about the right to privacy because you have nothing to hide is no different from saying you don’t care about free speech because you have nothing to say.

下决心使用 GnuPG 倒不是因为斯诺登,主要是因为 Matthew D. Green 的一段话:

如果我真的要把自己的性命托付给一个软件的话,我不会选那些华而不实的东西——我选 GnuPG,而且我大概会把它运行在一个与世隔绝的计算机上,再把计算机锁进地下室。

我没有地下室,但树莓派是绝佳的选择。

周围有些朋友,关注个人隐私,好友@yuhao 就是其一,所以我像记录下使用GnuPG的经验,为那些对个人隐私感兴趣的朋友, 也为我身边的好友而写。

这篇文章当然不会有多少人感兴趣,甚至大多数人会觉得对隐私的关注是杞人忧天、自寻麻烦,我想斯诺登已经给出了很好的答复。

《徒手攀岩》这部电影给了我这样一种信念,按照自己的信念去生活,无论它在别人眼里是否有意义。

关于GnuPG

维基百科对其介绍十分清晰:

GNU Privacy Guard(GnuPG 或 GPG)是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。GnuPG 是自由软件,遵循 IETF 订定的 OpenPGP 技术标准设计,并与 PGP 保持兼容。

基本的 GnuPG 程序有一个命令行界面,仍然存在许多提供图形用户界面的前端。

过程

GnuPG 使用用户自行生成的非对称密钥对来加密信息,由此产生的公钥可以同其他用户以各种方式交换,如密钥服务器。他们必须小心交换密钥,以防止得到伪造的密钥。

使用笔记

以下是我的使用笔记。

下载GnuPG

GnuPG 官方提供了下载连接

既然你关注安全,就应该关注安全的每个环节,安全领域具有强烈的短板效应。所以首先包装你下载的 GnuPG 是可信任的,避免它本身被注入代码。

在可能的情况下,尽量到 GnuPG 官方下载。下载之后校验一下。

官方的下载连接包含了不同操作系统的 GnuPG 版本,我日常在 MacOS 下工作,在此演示 MacOS 下的使用笔记,流程适用于其他系统。

ps: 如果你对安全性要求极高,推荐使用树莓派作为宿主机(或者使用tails), 它是开源的。任何的闭源代码都有风险。

校验软件安全性

这一步不是必须的,但很推荐这样做。

我使用gpgtools作为客户端,从官网可以看出软件的 SHA256 是 8ee4b57d759abc166deb0694835564f065151cd1e548bdffe4295f8602609310

下载好软件之后,本地校验 SHA256 的值:

1
2
openssl dgst -sha256 GPG_Suite-2019.1_83.dmg
SHA256(GPG_Suite-2019.1_83.dmg)= 8ee4b57d759abc166deb0694835564f065151cd1e548bdffe4295f8602609310

验证通过,软件本身是安全可信的。

如果你本地没有 openssl 的话,需要先安装。

生成密钥

安装好软件,首先生成密钥(同时生成公钥/私钥),过程和平时创建一个账号没有区别。

关于公钥和私钥,需要了解的知识不多,公钥用于加密,私钥用于解密。你要藏好私钥。公钥可以发给任何希望与你通信的人,只有你手头的私钥能用于解密信息。

创建完密钥后,你就可以把公钥(public key)发给你的朋友,让他们与你安全地通信。

公钥分发

如何安全发送公钥呢?

这和你对安全的要求有关,我直接对外公开我的公钥,公钥只是用于加密信息,对我而言,被其他人拿到是无所谓的(那只意味着ta可以给我发送私密消息),只有我自己的私钥可以解密。

加密文件

对文件进行加密是很简单的,在 MacOS 里,右键选择加密就行

解密也一样。

一般而言,你给朋友发送加密后的文件/文本,是使用 ta 的公钥,而不是用自己的公钥,所以你需要先导入 ta 的公钥, 然后在加密的过程中,软件会让你选择对应的加密公钥,操作过程很简单,跟着软件做就好了。

使用什么工具发送文件

使用什么工具发送加密文件呢?

由于你已经对文件做了加密,所以你可以选择任何工具来传输 ta,这些通道本身不安全是没关系的,所以使用 gmail、QQ、微信都无所谓。

我的公钥

通过指纹 0682A3B4568845EE,可以在 GPG Keychain Key server 上找到我的公钥,我们可以安全地通信了。

我的 OpenPGP key: D0F31D683FED7484B00B5E290682A3B4568845EE

文档

本文没有说清楚的地方,可以参考:

安全风险

中间人攻击(MITM)

维基百科上对中间人攻击的阐述很清晰

1
2
3
4
5
假设爱丽丝(Alice)希望与鲍伯(Bob)通信。同时,马洛里(Mallory)希望拦截窃会话以进行窃听并可能在某些时候传送给鲍伯一个虚假的消息。

首先,爱丽丝会向Bob索取他的公钥。如果Bob将他的公钥发送给Alice,并且此时马洛里能够拦截到这个公钥,就可以实施中间人攻击。马洛里发送给爱丽丝一个伪造的消息,声称自己是鲍伯,并且附上了马洛里自己的公钥(而不是鲍伯的)。

爱丽丝收到公钥后相信这个公钥是鲍伯的,于是爱丽丝将她的消息用马洛里的公钥(爱丽丝以为是鲍伯的)加密,并将加密后的消息回给鲍伯。马洛里再次截获爱丽丝回给鲍伯的消息,并使用马洛里自己的私钥对消息进行解密,如果马洛里愿意,她也可以对消息进行修改,然后马洛里使用鲍伯原先发给爱丽丝的公钥对消息再次加密。当鲍伯收到新加密后的消息时,他会相信这是从爱丽丝那里发来的消息。

示意图如下

维基百科给出了防御策略:中间人攻击

本地安全

任何软件都无法避免你本地计算机的漏洞,如果你在本地运行不安全的软件,而它们窃取你的私钥,那么 GnuPG 就无法保证你的安全。

如果你要求的安全等级比较高,就不要在本地安装闭源软件,请使用开源软件和系统(Linux),最好是干净的树莓派。

微信、QQ、360、Chrome、skype 之类的肯定是闭源软件,这不意味着它们一定会做坏事,我很愿意相信它们的善意。

但如果你十分关心安全,那么请只相信数学和技术。你可以相信任何公司的闭源商业软件,这是个人自由,但应当清楚,对任何闭源软件的信任,本质上是一种信仰,是一种情感上的决策, 你要清楚,你的安全寄托在它们的道德感和善意之上。

参考