如何导出我的 Protonmail 私钥?

信息安全 gnupg 质子邮件
2021-09-08 10:12:11

来自:https : //github.com/scastiel/protonmail-export

1) 打开 ProtonMail 应用程序并完全注销。您现在应该看到登录屏幕。

2) 打开浏览器的开发工具和网络选项卡以查看所有网络调用。

3) 输入您的用户名和密码,然后单击登录按钮。你不需要更进一步。

4) 在网络调用中,找到“/api/auth”。可能有几个,一定要选择带有“POST”请求方法的那个,而不是“DELETE”那个(无论如何都不包含任何信息)。

5) 在这个网络调用中,打开 Response 选项卡查看从服务器返回的原始数据,找到以 "PrivateKey": 开头的行,并将该行的其余部分从 "-----BEGIN PGP PRIVATE KEY 复制到最后一个 ",没有尾随逗号。

6) 打开开发工具的控制台选项卡,输入 console.log(<PASTE THE COPIED CONTENT HERE>) 然后回车。

7)复制命令的结果,并将其放入一个文本文件中,这样你就有了你的私钥!

但我被困在“6)”。

console.log("-----BEGIN PGP PRIVATE KEY B........----")

部分不输出任何东西(“....”部分当然是被审查的)。

所以现在..我可以手动格式化私钥看起来像私钥,我什至可以用“seahorse”导入它!我以为我赢了比赛,但是……当我尝试:

gpg --encrypt --sign --armor -r foobar@protonmail.ch message.txt

它要求输入 GPG 密钥密码。我使用密码管理器,所以我复制/粘贴了我使用的 MAILBOX 密码,但问题是:它不接受它!

问题:我错过了什么?

我还通过邮件询问了 scastiel,如果他回复,则在此处发布答案,但也许其他人也知道解决方案。

在步骤“5)”中,我可以看到有一行名为“KeySalt”。也许 Protonmail 在 scastiel 的 howto 之后引入了盐?

Protonmail 支持不会帮助导出私钥。

更新:我写了“MAILBOX”密码,这意味着我仍然使用带有两个密码的 Protonmail:一个用于登录,一个用于“解密”的邮箱密码。

4个回答

您的私钥的密码现在是您的邮箱密码(如果您使用 2 个密码)或您的登录密码(如果只使用一个密码)的哈希值。您现在还必须获取 KeySalt 值并使用 bcrypt 获取哈希值。

我按照此处列出的步骤使用 Firefox 下载了我的私钥密码: https ://github.com/scastiel/protonmail-export/issues/6

  1. 登录 ProtonMail
  2. 从与 GPG 私钥相同的 cookie 响应中获取 salt 值:
  3. 切换到开发者选项中的控制台选项卡
  4. 运行以下命令,但将 < LOGIN PASSWORD OR MAILBOX PASSWORD > 和 < KEYSALT FROM STEP 2 > 替换为其对应的值: password = "<LOGIN PASSWORD OR MAILBOX PASSWORD>"; salt ="<KEYSALT FROM STEP 2>"; saltBinary = pmcrypto.binaryStringToArray(pmcrypto.decode_base64(salt)); keySalt = dcodeIO.bcrypt.encodeBase64(saltBinary, 16); bcryptKey = dcodeIO.bcrypt.hashSync(password, '$2y$10$' + keySalt); key = bcryptKey.slice(29); console.log(key);
  5. 控制台输出是您的私钥的密码

我写了这篇关于如何导出你的私钥的教程。在编写它时,ProtonMail 没有“单一密码”身份验证的功能。您必须使用第一个密码来解锁您的帐户(您的 ProtonMail 密码),然后使用您的私钥密码来解锁您的密钥。

我猜如果您激活了单一密码身份验证(这可能是新帐户的默认设置),导出私钥将不再​​起作用。这个key是从我猜的ProtonMail密码算出来的,不知道怎么找到,但是一定有办法的……

如果您使用两个密码模式,这应该仍然有效。

如果您使用单一密码模式,则私钥密码不是您的登录密码。如果需要,可以在此处查看它是如何生成的:https : //github.com/ProtonMail/WebClient/blob/public/src/app/authentication/services/passwords.js#L29

基本上登录密码和服务器返回的盐是使用 bcrypt 散列的。结果是私钥密码。

编辑:即使您使用两个密码模式,您的邮箱密码也会使用 bcrypt 进行哈希处理,就像单一密码模式一样。

ProtonMail 不提供(还)导出电子邮件的方法,例如 IMAP 访问或任何导出选项。对于几种用法,那将非常好:

备份您的电子邮件,以防 ProtonMail 服务器附近发生大规模核爆炸;如果您对 ProtonMail 不满意,请将您的电子邮件转移到其他邮件提供商;等等。另外,我坚信互联网上的每项服务,无论它多么出色,尤其是如果您付费,都应该很容易离开。

这仍然是可能的,但您将被迫使用未记录的 ProtonMail API,并通过逆向工程进行。这个小程序将使您的过程变得非常容易,尽管不是完全自动化的。

当然,我希望这个程序很快就不再需要了,因为 ProtonMail 将提供这样一个选项 :)

特征

实施的:

将您的电子邮件(已解密)导出到本地 EML 文件,然后您可以将其导入另一个邮件客户端。从收件箱、已发送和存档文件夹中获取您的电子邮件。尚未实施:

导出附件。

安装

您需要在系统上安装 Node.js 及其包管理器 npm。

要安装程序,请运行以下命令:

npm install -g protonmail-export

如何下载您的 ProtonMail 私钥?

ProtonMail 将您的私钥的加密版本存储在其服务器上。从您帐户的设置窗格中,您可以下载您的公钥;不幸的是,您无法下载您的私钥。好消息:您可以使用浏览器的开发工具轻松找到它。就是这样:

1.打开 ProtonMail 应用程序并完全注销。您现在应该看到登录屏幕。

2.打开浏览器的开发工具和网络选项卡以查看所有网络调用。

3.输入您的用户名和密码,然后单击登录按钮。你不需要更进一步。

4.在网络调用中,找到“/api/auth”。可能有几个,一定要选择带有“POST”请求方法的那个,而不是“DELETE”那个(无论如何都不包含任何信息)。

5.在这个网络调用中,打开 Response 选项卡查看从服务器返回的原始数据,找到以 开头的行"PrivateKey":,并复制该行的其余部分,从"-----BEGIN PGP PRIVATE KEY到最后一个 ",没有尾随的逗号。

6.打开开发工具的控制台选项卡,输入console.log(<PASTE THE COPIED CONTENT HERE>)然后回车。

7.复制命令的结果,并将其放入一个文本文件中,这样你就有了你的私钥!

请注意,私钥是使用您的 ProtonMail 帐户的秘密密码(您在登录后输入的密码,第二个密码)加密的。因此,如果有人窃取了您的邮件,您现在拥有的私钥不足以解密您的邮件;但是请尝试将其保存在安全的地方;)

如何导出您的电子邮件?

首先你需要几个元素:

.你的 ProtonMail 的账户私钥(见下面的附录),让我们把它放在一个名为 private-key.txt 的文件中。

. 用于加密此私钥的密码(即您在登录时输入的第二个密码)。

.有关在 ProtonMail 上打开的会话的一些技术信息。让我们获取最后一点中提到的信息。

注意:这些说明适用于 Chrome/Chromium 浏览器,但对于其他浏览器应该没有太大不同。

1-首先使用您的 ProtonMail 帐户打开一个新会话,并确保您的浏览器开发工具已打开。如果它们在页面加载时没有打开,只需打开它们并重新加载页面。

2-在开发工具的 Network 选项卡中,找到对 /api/users URL 的调用,更具体地说,定位到此调用的 Request Headers 部分。

3-将这两个标头的值复制粘贴到某处:Cookie(以“AUTH-”开头)和 x-pm-session(32 个字母数字字符)。拥有所有这些元素后,您最终可以通过运行以下命令导出邮件:

protonmail-export -i "<session_id>" -c "<cookie>" -p <path_to_private_key_file> <output_directory>

例如,这可能看起来像这样:(注意输出目录必须已经存在)

protonmail-export -i "95bc88ea1e94e25357e12a433e9b5ee5" -c "AUTH-95bc88(...); NOTICE-ae3cce(...)=true" -p ~/private-key.txt ~/protonmail-messages

系统会要求您提供密码以解密您的私钥。然后,您将在输出目录中为每封电子邮件创建一个文件。大多数邮件客户端都可以读取这些文件并将其导入现有邮箱。