使用 PGP 密钥建立有信誉的假名

信息安全 验证 隐私 pgp 匿名
2021-09-02 05:45:18

这对我来说已经成为一个思想实验。

假设有人想建立一个假名以及对应的 PGP Key,其他人如何验证名称和密钥之间的对应关系?

通常,PGP 密钥是给真实的人的,他们的身份可以通过 IRL 进行验证,但这并不适用于此。

我最初的想法是假名可以是基于密钥指纹的名称,但是根据字符数,很容易生成一个也满足此要求的新密钥。

是否有一种策略(可能更具社交性而非技术性)让某人验证此对应关系?

编辑:

具有此要求的化名的潜在目的可能与 Satoshi Nakamoto 或举报人相同。希望不断发布可验证来自化名所有者的文档或软件。

4个回答

使用假名密钥的挑战不仅在于匿名性,还在于匿名性。还有一个额外的问题是您的身份不唯一难以证明。考虑到您的假名/昵称已经确立(也就是说,您使用的是现有身份,而不是根据散列或这些行中的其他内容组成新身份),仅凭您的昵称不足以证明您的身份和声誉。

如果你的昵称是 Sam,如果你朋友的昵称是 Sam,并且如果你们俩都有一个“可信”的假名密钥,那么你们谁都不能对对方大喊大叫告诉他:“嘿,你不是真正的 Sam! "

一种解决方案是将有关您在线身份的所有信息重新组合到某个独特的地方(您告诉“我是 StackExchange 上的 Sam”、“我拥有samlanning.com域和网站”等),然后让几个人验证并确认所有这些身份我可以想到两种方法:

  1. 加入Keybase 之类的网站(或自己制作/托管),它完全按照我的描述进行,并且基于 OpenPGP。尽管是内部的,但所有这些“中心唯一身份”为身份/假名建立了信任网络。个人资料看起来像这样(是的,即使是 GnuPG 的主要作者也使用这个网站)。

  2. 使用 OpenPGP(尤其是 GnuPG),找到愿意签署(认证)假名密钥的人,遵守他们验证您的假名身份的个人方式,并要求他们在他们的认证中包含策略 URL 和符号数据

当我验证其他人的密钥时,我个人会这样做:

gpg --ask-cert-level \
     --cert-policy-url http://diti.me/pgp/\#policy \
     --cert-notation CD42FF00@diti.me=http://diti.me/pgp/certs/%f.notes.asc \
     --sign-key

策略 URL是一个URL(此处为 Internet 文档),您可以在其中向世界描述您的 OpenPGP 密钥认证策略是什么。签署您的假名密钥的人应该告诉(在本文档中)他们实际上证明了假名密钥,以及如何证明。

关键符号是形式的任意文本key=valueOpenPGP 规范实际上并没有具体说明实现应该如何使用这些,但它们的一个用途是将 URL 作为value. 但是,如果您愿意,您可以简单地让签名者输入一些文本,例如“我仔细检查了 Sam 的假名身份”。

使用我上面的命令,您可以看到,在 keyservers上,默认显示策略 URL 和符号数据:

sig  sig1  CD42FF00 2014-04-07 __________ __________ []
    Policy URL: http://diti.me/pgp/#policy
    Notation data: CD42FF00@diti.me http://diti.me/pgp/certs/A31D4F81EF4EBD07B456FA04D2BB0D0165D0FD58.notes.asc

作为记录,这是我签署 CAcert.org 的自动 GPG 签名密钥,我将在此处留下一个指向符号数据的 Web 存档链接

只要可以读取签名者生成的符号数据,任何人都可以/可以决定他们是否信任您的假名身份。使用这些,任何愿意仔细检查您的假名的信誉和可信度的人实际上都可以这样做。

编辑:实际上,我想我在第 2 点可能有点跑题了。您的问题只是关于假名认证过程,还是它的审计

在和一些朋友多聊了一会儿之后,我们可能想出了一个候选的解决方案。

鉴于我们试图避免有人冒充原始密钥持有者,我们不希望有人能够生成新的密钥对,重新签署原始人所做的一切,并声称他们拥有相同的假名。

您可以使用分布式时间戳系统来证明假名和公钥之间的关联存在于特定时间(即创建假名的时间)。例如https://www.btproof.com/

然后人们可以认为这足以证明关联是有效的,并选择签署 UID。

在阅读了这个问题并了解了 Bicoin 时间戳之后,我想出了一个相对简单的方法来让自己成为一种方法来证明你是使用 PGP 密钥和你拥有的比特币地址的假名 ID 的所有者。该系统依赖于这样一个事实,即为了解锁这两个东西,您需要一个秘密,原则上,该秘密由您并且只有您拥有。

  1. 创建 PGP 密钥对。
  2. 在您的客户端上创建一个比特币地址。备份属于该地址的钱包,否则您将无法再验证自己!
  3. 根据 [此处的此页面] [1] 在您的密钥上执行比特币时间戳。基本上,这相当于以下内容:
    1. 获取密钥指纹的 SHA256 哈希值。
    2. 将其转换为语法上有效的比特币地址。
    3. 从您创建的地址到您根据密钥指纹的哈希构造的地址发送一笔价值 10 美分的 BTC 的小额付款。比特币将消失,因为付款被发送到一个无法被任何私钥解锁的地址。然而,由于地址在语法上是有效的,交易将通过,这将发布到区块链,由比特币网络上的每个单个胖客户端共享,一条消息说当块 X 在时间 T 附加到区块链时,地址 1YouR0wn4dRESS 向地址 1SHA256sUm0fY0urkEYf1NG3rPr1nT 发送了 N 个比特币。
  4. 最后,将时间戳交易的详细信息放在私钥的信息字段中(例如,创建一个新的密钥 ID,并在用户名字段中输入类似“从 1YouR0wn4dRESS 发送到 1SHA256sUm0fY0urkEYf1NG3rPr1nT 的 0.0005 BTC 时间戳”)并将您的密钥上传到密钥服务器。

要让某人验证您的身份,请遵循以下协议:

  1. 让验证者使用您的公钥向您发送加密消息,其中他要求您向验证者选择的地址发送小额付款。
  2. 使用您的私钥解密消息。这将证明您是密钥私有部分的所有者。
  3. 将付款从 1YouR0wn4dRESS 发送到身份验证器发送给您的地址。这将证明您是花费与地址 1YouR0wn4dRESS 关联的钱包资金所需的私钥的所有者。
  4. 只是为了获得额外的信任,您可以让身份验证器在 blockchain.info 上查找您的时间戳交易

只有当您拥有使用您的公钥解锁发送给您的消息的私钥时,才能成功完成第 3 步,因为您需要它来阅读付款说明。只有当您拥有用于解锁地址为 1YouR0wn4dRESS 的钱包的私钥时,支付才能完成,当您为您的密钥指纹添加时间戳时,该私钥已进入区块链。您现在已通过身份验证。

我最初的想法是假名可以是基于密钥指纹的名称,但是根据字符数,很容易生成一个也满足此要求的新密钥。

如果指纹基于足够强的单向散列函数,那么生成另一个同样产生相同结果的密钥在计算上应该是不可行的,但是假名的长度需要与散列输出相似,因为将其缩减为某种东西更难忘会大大增加产生碰撞的难易程度。