03.08 比特幣迎來新技術更新,Core開發者教你如何驗證客戶端

今日,比特幣又迎來了新的進展,Core開發者Luke Dashjr宣佈了Knots 0.19.1.knots20200304客戶端的發佈。

比特币迎来新技术更新,Core开发者教你如何验证客户端

注:Bitcoin Knots是Bitcoin Core的衍生客戶端,其具有一些Bitcoin Core尚未實施的功能,該代碼庫主要是由Luke Dashjr在負責維護

關於新客戶端更新的內容,你可以在這裡找到:https://github.com/bitcoinknots/bitcoin/blob/v0.19.1.knots20200304/doc/release-notes.md

而擺在我們面前的問題是,如何驗證自己下載的客戶端是安全的,而不是經惡意篡改的呢?當然,確保從可信網站下載是必須的,那我們又如何確保該可信網站沒有被攻擊者篡改呢?

這也是本文要講的內容,原文作者是Luke Dashjr。

期望

以下的說明,要求你瞭解文件在計算機中的存儲方式(理論上來講,如果你知道目錄/文件夾是什麼就可以了),以及懂得如何使用命令行來運行程序和訪問文件。如果你不瞭解這些概念,請先從指南開始入手。

請注意,本文的說明只能幫你安全地安裝比特幣客戶端,其並不會幫助你保護你的硬件、操作系統,或者避免安裝其它引入惡意軟件的應用。通常,如果計算機的其他地方受到威脅,則無論你如何驗證自己安裝的客戶端,你的節點也會受到威脅。

如果你想要一個絕對安全的節點,除了本文提到的說明之外,你至少還需要避免使用後門硬件(包括樹莓派,英特爾或AMD生產的任何產品),而僅運行可信任的基於Linux的操作系統,僅安裝或使用你的操作系統供應商提供的軟件,或使用GnuPG進行了其他驗證(如本文所述)的軟件,並確保該軟件更新到最新的漏洞修復版本

即使您無法解決這些問題,因此無法獲得最大的安全性,但這也不意味著你應該放棄:無論如何,驗證比特幣節點軟件仍然是一個好主意。

概述

要確保你所安裝的比特幣客戶端是安全的,有三個重要的步驟:

每個步驟都取決於先前的步驟是否成功,雖然我們可以跳過一個步驟,但重要的是要了解,除非所有步驟都成功,否則我們就相當於沒有對安裝進行驗證。

請注意,舉例來說,我將在用於 ppc64le Linux的 Bitcoin Knots v0.19.0.1.knots20200104客戶端上驗證我自己的簽名,而要驗證其他人的簽名或其他文件,你需要更改命令行以使用該指紋或文件名。

步驟0:安裝加密軟件GNU Privacy Guard(GPG)

在開始之前,你需要確保自己已安裝了GNU Privacy Guard(GPG)工具,這是文件的加密驗證所需的。

如果你運行了一個基於Linux的系統,通常可通過操作系統供應商那進行安裝(最近,這通常會是默認安裝的),你可以通過運行<code>gpg --version/<code>進行檢查。如果沒有,請嘗試使用以下命令之一進行安裝(如果失敗,請轉到下一個):

<code>
apt-get install gnupg
dnf install gnupg2
yum install gnupg2
emerge app-crypt/gnupg
pacman -S gnupg
apk add gnupg
/<code>

如果您不幸使用的是Windows或macOS操作系統,則可以從官方網站下載GnuPG,但我不知道有任何安全的方式可以驗證這種下載,當然,它們確實提供了簽名,但這裡就遇到了雞與蛋的問題:在你安裝好的副本之前,你無法驗證這些簽名!

步驟1:驗證OpenPGP密鑰

可以說,這一步是驗證過程中最困難的部分:你需要確認你實際使用的密鑰,是你信任之人所發佈的正確密鑰。如果你不小心,可能會得到一個假冒的“Luke Dashjr”密鑰!

每個OpenPGP密鑰都有一個“指紋”,即40個十六進制字符(數字0-9和a-F),有時會顯示空格,以便於閱讀。如果你確保使用的密鑰指紋與受信任簽名者的指紋匹配,則你知道自己擁有了正確的密鑰。

獲取密鑰或指紋

驗證密鑰最安全的方法,就是親自見面,並確認密鑰“指紋”。幾乎沒有人記得他們的密鑰指紋,所以我們可能不得不在自己的筆記本電腦或手機上查找,偶爾(通常是在會議上)可能會有“密鑰簽署方”,一群人在會議上確認其他人的指紋,每個參與者要麼親自朗讀自己的指紋,要麼手動確認每個人看到的或聽到的都是正確的。如果你機會參與這樣的會議,這是一個好的方法來一次性驗證很多密鑰。

如果你不感興趣或沒有機會親自見面,理想情況下應該從多個來源驗證密鑰。有時,會議會發布演示視頻,其中的密鑰指紋可能會顯示在幻燈片中。當然,由於“deep fake”這些新技術的存在,要注意視頻中的幻燈片是容易被操縱的。

開發人員通常會在他們的網站上發佈他們的密鑰或指紋,也許還有其他一些途徑(例如,我的密鑰或指紋,會放在個人網站、bitcoinknots.org、bitcoin.org以及GitHub上)。

如果你已經安裝你了你信任的軟件副本,有時它會包含驗證更新所需的密鑰(目前Bitcoin Core只包含源代碼)。

檢查密鑰文件的指紋

要查看密鑰文件的指紋,你可以使用以下命令:
<code>
gpg --import-options show-only --import --with-fingerprint luke-jr.asc
/<code>

這將輸出有關密鑰文件的許多信息,而相關信息位於最上面:

<code>
pub rsa8192 2012-03-23 [SC] [expires: 2020-06-09]
E463 A93F 5F31 17EE DE6C 7316 BD02 9424 21F4 889F
/<code>

在本示例中,<code>E463 A93F 5F31 17EE DE6C 7316 BD02 9424 21F4 889F/<code>就是我的密鑰指紋。

注意:如果GPG提示密鑰過期了,那可能也沒有關係!在步驟2中,你將更新到同一密鑰的最新版本,這通常會延長到期日期。

導入已驗證的密鑰

無論你如何驗證密鑰,都應該確保記住你使用的是哪個密鑰,以便將來更新時可驗證使用的是同一個密鑰。即使你跳過了驗證密鑰步驟(這是不安全的),至少這將確保你的更新有相同的簽名者。

當你確信自己擁有的密鑰是正確的時候,你可以這樣導入它(將<code>luke-jr.asc/<code>替換為包含所需密鑰的文件名):

<code>
gpg --import < luke-jr.asc
/<code>

或者如果你只有指紋,像這樣(把你想用的密鑰指紋放進去!):

<code>
gpg --keyserver hkp://keyserver.ubuntu.com --recv-key E463A93F5F3117EEDE6C7316BD02942421F4889F
/<code>

步驟2 :驗證簽名

現在你知道要用什麼密鑰進行驗證了,下一步就是檢查簽名是否有效。

在繼續此步驟之前,必須確保簽名者密鑰的副本是最新的。如果你不這樣做,你可能會收到一條關於密鑰已過期的消息。運行(使用你所需的指紋):

<code>
gpg --keyserver hkp://keyserver.ubuntu.com --refresh-key E463A93F5F3117EEDE6C7316BD02942421F4889F
/<code>

接下來,(除了你正在檢查的程序文件之外)你將需要兩個文件:包含文件指紋列表的“<code>.assert/<code>”文件和包含該列表簽名的“<code>.assert.sig/<code>”文件。這是因為我們所做的不是對程序文件本身進行簽名,而是對所有文件進行指紋識別,然後對該列表進行簽名。因此,這兩個文件你都是需要的。

  1. Bitcoin Core的“assert”文件對發佈在這裡:https://github.com/Bitcoin-Core/gitian.sigs/find/master;
  2. Bitcoin Knots的“assert”文件對發佈在這裡:https://github.com/bitconinkots/gitian.sigs/find/Knots

注意,每個簽名者都有一個單獨的文件對。如果你正在驗證是否有多個人簽名了你的文件(你應該這樣做),則需要檢查每個文件對。此外,你還需要確保自己正在獲取要驗證的版本的文件!

在列表中找到所需文件後,單擊鏈接在瀏覽器中打開該文件,然後右鍵單擊“Raw”或“Download”按鈕並選擇“鏈接另存為”。

一旦你有了這兩個“assert”文件,你就可以通過運行來檢查簽名(將文件名調整為特定的<code>.assert.sig/<code>)

<code>
gpg --verify bitcoin-core-linux-0.19-build.assert.sig
/<code>

如果這步成功了,你就會得到下面的結果:

<code>
gpg: Signature made Sun 19 Jan 2020 03:47:15 AM UTC
gpg: using RSA key E463A93F5F3117EEDE6C7316BD02942421F4889Fgpg: Good signature from “Luke Dashjr <luke>” [ultimate]/<luke>/<code>

注意密鑰的指紋是粗體顯示的。該指紋必須要和你在步驟1中驗證的密鑰匹配,否則它可能是由其他人簽名的!關於“好籤名”的部分也很重要,而名字和電子郵件地址卻不重要,如果指紋是錯誤的,這兩個都可能是偽造的

假設一切順利,你現在知道“<code>.assert/<code>”文件是由所述密鑰的控制者提供擔保的,並且可繼續驗證你的實際程序文件,是否是該“<code>.assert/<code>”文件中列出的。

步驟3:驗證文件本身

要驗證程序文件,必須首先對其進行加密哈希驗證(基本上是提取其指紋)。

這是通過一個簡單的命令完成的(注意替換你正在驗證的實際文件名!):

<code>
Linux: sha256sum bitcoin-0.19.0.1.knots20200104-powerpc64le-linux-gnu.tar.gz
Windows: certUtil -hashfile bitcoin-0.19.0.1.knots20200104-win64.zip SHA256
macOS: shasum -a 256 bitcoin-0.19.0.1.knots20200104-osx-unsigned.dmg
/<code>

這將輸出如下內容:

<code>
d370692590c4546ac0de250da91c6c288d9ee5252f1a4b857a5b80c4e3d81149 bitcoin-0.19.0.1.knots20200104-powerpc64le-linux-gnu.tar.gz
/<code>

這是文件內容的指紋,後跟指定的文件名。

現在,在任何純文本編輯器/查看器中打開“<code>.assert/<code>”文件,並查找該指紋。它應該在頂部的“<code>out_manifest/<code>”部分,如果你到達了“<code>in_manifest/<code>”或“<code>base_manifests/<code>”,那麼你已經走得太遠了。

如果你在“<code>.assert/<code>”文件中找到了它,那麼你已經驗證了你擁有的文件,是與簽名者所擔保的文件是相同的(你將在指紋右側的“<code>.assert/<code>”文件中看到它們的文件名,它可能與你的文件名是相同的)。

而如果“<code>.assert/<code>”文件中缺少該文件,則可能表示你使用了錯誤的“<code>.assert/<code>”文件,或者你的文件是不匹配的(在這種情況下,你將在預期的文件名旁看到另一個指紋)。如果文件已列出,但有著不同的指紋,請不要打開文件,而是保存它(我們可能會要求您提供副本),並與受影響項目的安全團隊聯繫


分享到:


相關文章: