我是刚接触GnuPG并试图了解如何最好地使用它的人。我已经回顾了非技术人员对GPG / PGP的简短而易懂的解释?,但是大多数指南都是从单机的角度来解释PGP。

我想在三种计算设备上使用GnuPG: Linux PC,Linux笔记本电脑和Android手机。

基本用例是对由IMAP服务管理的电子邮件进行加密/解密,因此所有设备都需要相同的私钥进行解密。

我认为我的选择是:


只需将我的所有密钥复制到每个设备上的密钥环中,并且主要依靠私钥密码进行保护。
创建一个主密钥(带有--gen-key)来代表我的身份,然后创建一个单独的一次性密钥(再次带有--gen-key)来加密/解密电子邮件,并用主密钥签名。前者仅驻留在我的PC上,后者分布在每个设备上。只要我的移动设备没有受到破坏,那么一次性密钥就仍然有效。

我可能过于偏执,这使事情变得比原来更加复杂,但是请幽默。我相信不要把所有的鸡蛋都放在一个篮子里。

主密钥应该是我的数字身份。将花费大量的精力来建立围绕该身份的信任,我宁愿遭受妄想狂带来的不便,也不愿因粗心而丢失我的密钥,而不得不围绕新的主密钥建立信任(也许这不如我糟糕想,但我对此并不陌生。)

我比笔记本电脑更容易丢失笔记本电脑或手机。如果损失==折衷,那么我宁愿失去一个一次性密钥对(我可以撤销),而不是我的主密钥对。我总是可以将我的主密钥放在新的一次性密钥上。

很长的问题很抱歉。 :-)

TL; DR

密码是否足以保护我的主私钥跨多个设备存储?

我对方案2的计划可行吗?我有什么问题还是可以改进?

如果选项#2是一个坏主意,那么在多个设备上为单个用户使用GnuPG时的最佳实践是什么?

#1 楼

好吧,这有点尴尬。我花了一个多星期的时间来试图解决这个问题,答案似乎在于子键-GnuPG手册和FAQ掩盖了这个主题。

在研究什么子键时是,为什么可以使用它们代替--gen-key,我偶然发现了这个宝石:http://wiki.debian.org/subkeys。

Debian的Wiki解释了如何实现选项#2。 (请参阅OP)使用带有子密钥的主密钥,并进一步说明了将主密钥存储在备份介质(例如闪存驱动器)后如何从任何系统中删除该主密钥。然后可以将子密钥分配到每个设备上的我的密钥环中。



主要不依靠密码来保护主密钥,
如果有任何系统受到威胁,则主密钥将不会立即可用(除非我愚蠢地将闪存驱动器插入电源,或将所说的驱动器连接到受到破坏的系统上),这是Debian开发团队实施的一种做法。 br />使用GnuPG的子项功能。

Debian Subkey Wiki上的相关部分




现有GnuPG文件($ HOME / .gnupg)的备份。确保他们安全。如果在以下步骤中出现问题,则可能需要返回已知的好地方。 (注意:umask 077将导致备份权限受限。)


umask 077; tar -cf $HOME/gnupg-backup.tar -C $HOME .gnupg



创建新的签名子密钥。


找到您的密钥ID:gpg --list-keys yourname

gpg --edit-key YOURMASTERKEYID
gpg>提示符下:addkey

这会要求您输入请输入密码。
选择“ RSA(仅签名)”密钥类型。
选择4096(或2048)位密钥大小是明智的选择。
选择到期日期(您可以比主键更频繁地旋转子键,或者在主键的使用寿命内保留它们,而不会过期)。
GnuPG最终会创建一个密钥,但是您可能需要等待它才能获得足够的熵。
保存密钥:save



您可以重复此操作,并根据需要创建一个“ RSA(仅加密)”子密钥。
现在将$HOME/.gnupg复制到USB驱动器。

这是棘手的部分。您需要删除私钥,但不幸的是,GnuPG没有提供便捷的方法。我们需要导出子项,删除私钥,然后再导入子项。


导出子项:gpg --export-secret-subkeys YOURMASTERKEYID >secret-subkeys(要选择要导出的子项,请指定每个子项ID,然后分别指定感叹号:gpg --export-secret-subkeys SUBKEYID! [SUBKEYID! ..]
删除主密钥:gpg --delete-secret-key YOURMASTERKEYID

将子项导入回:gpg --import secret-subkeys

验证gpg -K显示的是sec#而不是sec您的私钥。这意味着密钥并不真正存在。 (请参阅gpg --export-secret-key YOURMASTERKEYID | gpg --list-packets的输出中还存在一个伪OpenPGP数据包。)
(可选)更改保护子项的密码:gpg --edit-key YOURMASTERKEYID passwd。 (请注意,备份中的私有密钥材料(包括私有主密钥)将受到旧密码的保护。)



您的计算机现在可以正常使用了。

当您需要使用主密钥时,请安装加密的USB驱动器,并设置GNUPGHOME环境变量:

export GNUPGHOME=/media/something
gpg -K


或使用--home命令行参数:

gpg --home=/media/something -K


后一个命令现在应使用sec而不是sec#列出您的私钥。

多个子密钥每台机器vs.所有机器一个单一子键

摘自Debian子键Wiki。最初在评论中指出。 [改写]和强调我的。

一个人可能会想在每台计算机上拥有一个子密钥,因此您只需要交换该计算机上可能受到威胁的子密钥。如果在所有计算机上都使用单个子密钥,则需要在所有计算机上交换该子密钥(当单个子密钥被怀疑或被盗用时)。

但这仅适用于签名子密钥。如果您有多个加密子密钥,则说gpg仅对最新的加密子密钥进行加密,而不对所有已知且未撤销的加密子密钥进行加密。

评论


好的问与答,但是AFAIK的设置仍然存在一个问题...这非常适合签名,但是如果您不想在不同设备之间共享相同的enc密钥,那么对于加密来说却不是,因为有人让您接受加密的接收者消息,默认情况下,gpg使用生成的最新未吊销的enc密钥。不可能强制发送者根据UID(家庭或工作等)使用特定的enc子项。

– KurzedMetal
2012-10-17 2:12



也许这是一个问题。我最担心的是失去围绕我的主密钥(仅签名)建立的信任网络。当然,加密子项必须存在于我用来读取加密消息的所有设备上。如果我的加密密钥曾经遭到破坏,那么恢复过程将只涉及我自己。而不是丢失我的主签名密钥,而不得不要求/说服我的信任网络来签名新密钥。我无意在我的保管库中重新定位加密子项。

–贾斯汀C
13年7月16日在20:06

#2 楼

作为不喜欢单点故障(包括主密钥,尤其是密码)的人,这就是我要做的方法。它允许设备通过信任网络进行操作,同时仍然允许分散的身份。

我不知道是否已经存在用于此目的的系统,但是我认为它可能与一个cron作业和几行Bash。在此系统中,您有两类密钥对:设备密钥对和时间范围密钥对。在每个设备上为用户生成一个设备密钥对,并在该设备的整个生命周期内保持不变。时间范围密钥对是由中央服务器按常规间隔(每月,每天,每小时-取决于您想要的偏执程度)生成的。公用密钥是公开宣布的(服务器本身具有用于签名的自己的设备密钥对),并且专用密钥是使用每个有权访问此密钥的设备的公用密钥加密分发的。 (此分发应尽可能地私密,例如,使设备直接连接到服务器。)

对于签名消息,您可以使用从其发送消息的任何设备的设备密钥。如果有人想向您发送消息,则可以使用您当前的公共时间框架密钥对其进行签名。 (他们应该有一个自动的系统来跟上公告。)然后,您可以从任何设备上读取他们的消息。

要读取较旧的加密消息,会根据每个设备上的备份备份较旧的时间帧密钥对。适当的策略(如果愿意,还包括生成时间框架密钥对的服务器-再次取决于您的偏执程度),在该策略中,您还有另一组受密码保护的密钥对可以保护较旧的密钥(但是随着时间的流逝,密码会越来越多)记得放心)。

如果某台设备被盗或以其他方式受到破坏,则可以使用另一台公共信任的设备来创建一条公开签名的消息,以验证您的身份(通过任何方式,例如,注意您将参加公开聚会和/或让可信赖的朋友亲自验证您的身份),并撤消遭到破坏的设备密钥以及它可以访问的任何时间范围密钥。撤消密钥时,还将从服务器的受信任设备列表中删除被盗设备(带有密码和受信任设备密钥)。

信任新发布的设备密钥的策略应遵循类似当前的信任策略-我认为适当的策略是信任生成服务器,移动设备和大型设备,因为很难以协调一致的方式窃取/渗透用户的电话,台式机和VPS在用户注意到之前抢劫。

如果服务器受到威胁,则只需按照针对任何其他受感染设备所述的相同步骤将其吊销(可能具有与添加新设备类似的更强策略)。 ,然后继续使用经过重新保护的或全新的服务器(带有新的设备密钥对)。

评论


撤销部分在撰写时有些阴沉-应该可以从任何其他设备发出通知来撤销设备(以免有人偷了您的笔记本电脑而您的手机无法直接与服务器联系,以免失败)。由小偷完成(因此设备应具有受密码保护的密钥才能撤消)。在报告冲突的情况下,应暂时不信任所有密钥,直到可以执行第三方的手动验证为止。

– Stuart P. Bentley
2014年8月2日,1:11

实际上,建议您使用另一种机制来撤销密钥,即使用一个强大的公共密码,该机制会定期手动更新(替换)-这样,您可以在不依赖任何设备的情况下撤销密钥(例如只要您将密码保密,就只能用手机将其销毁)。

– Stuart P. Bentley
2014年8月2日,下午1:26