編譯:灑脫喜
"Don't Trust, Verify!"
今日,比特幣又迎來了新的進展,Core開發者Luke Dashjr宣佈了Knots 0.19.1.knots20200304客戶端的釋出。
(注: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進行了其他驗證(如本文所述)的軟體,並確保該軟體更新到最新的漏洞修復版本。
即使您無法解決這些問題,因此無法獲得最大的安全性,但這也不意味著你應該放棄:無論如何,驗證比特幣節點軟體仍然是一個好主意。
概述
要確保你所安裝的比特幣客戶端是安全的,有三個重要的步驟:
驗證OpenPGP金鑰;
驗證簽名;
驗證檔案本身;
每個步驟都取決於先前的步驟是否成功,雖然我們可以跳過一個步驟,但重要的是要了解,除非所有步驟都成功,否則我們就相當於沒有對安裝進行驗證。
請注意,舉例來說,我將在用於 ppc64le Linux的 Bitcoin Knots v0.19.0.1.knots20200104客戶端上驗證我自己的簽名,而要驗證其他人的簽名或其他檔案,你需要更改命令列以使用該指紋或檔名。
步驟0:安裝加密軟體GNU Privacy Guard(GPG)
在開始之前,你需要確保自己已安裝了GNU Privacy Guard(GPG)工具,這是檔案的加密驗證所需的。
如果你執行了一個基於Linux的系統,通常可透過作業系統供應商那進行安裝(最近,這通常會是預設安裝的),你可以透過執行gpg --version進行檢查。如果沒有,請嘗試使用以下命令之一進行安裝(如果失敗,請轉到下一個):
apt-get install gnupgdnf install gnupg2yum install gnupg2emerge app-crypt/gnupgpacman -S gnupgapk add gnupg
如果您不幸使用的是Windows或macOS作業系統,則可以從官方網站下載GnuPG,但我不知道有任何安全的方式可以驗證這種下載,當然,它們確實提供了簽名,但這裡就遇到了雞與蛋的問題:在你安裝好的副本之前,你無法驗證這些簽名!
步驟1:驗證OpenPGP金鑰
可以說,這一步是驗證過程中最困難的部分:你需要確認你實際使用的金鑰,是你信任之人所釋出的正確金鑰。如果你不小心,可能會得到一個假冒的“Luke Dashjr”金鑰!
每個OpenPGP金鑰都有一個“指紋”,即40個十六進位制字元(數字0-9和a-F),有時會顯示空格,以便於閱讀。如果你確保使用的金鑰指紋與受信任簽名者的指紋匹配,則你知道自己擁有了正確的金鑰。
獲取金鑰或指紋
驗證金鑰最安全的方法,就是親自見面,並確認金鑰“指紋”。幾乎沒有人記得他們的金鑰指紋,所以我們可能不得不在自己的膝上型電腦或手機上查詢,偶爾(通常是在會議上)可能會有“金鑰簽署方”,一群人在會議上確認其他人的指紋,每個參與者要麼親自朗讀自己的指紋,要麼手動確認每個人看到的或聽到的都是正確的。如果你機會參與這樣的會議,這是一個好的方法來一次性驗證很多金鑰。
如果你不感興趣或沒有機會親自見面,理想情況下應該從多個來源驗證金鑰。有時,會議會發布演示影片,其中的金鑰指紋可能會顯示在幻燈片中。當然,由於“deep fake”這些新技術的存在,要注意影片中的幻燈片是容易被操縱的。
開發人員通常會在他們的網站上釋出他們的金鑰或指紋,也許還有其他一些途徑(例如,我的金鑰或指紋,會放在個人網站、bitcoinknots.org、bitcoin.org以及GitHub上)。
如果你已經安裝你了你信任的軟體副本,有時它會包含驗證更新所需的金鑰(目前Bitcoin Core只包含原始碼)。
檢查金鑰檔案的指紋
要檢視金鑰檔案的指紋,你可以使用以下命令:
gpg --import-options show-only --import --with-fingerprint luke-jr.asc
這將輸出有關金鑰檔案的許多資訊,而相關資訊位於最上面:
pub rsa8192 2012-03-23 [SC] [expires: 2020-06-09]E463 A93F 5F31 17EE DE6C 7316 BD02 9424 21F4 889F
在本示例中,E463 A93F 5F31 17EE DE6C 7316 BD02 9424 21F4 889F就是我的金鑰指紋。
注意:如果GPG提示金鑰過期了,那可能也沒有關係!在步驟2中,你將更新到同一金鑰的最新版本,這通常會延長到期日期。
匯入已驗證的金鑰
無論你如何驗證金鑰,都應該確保記住你使用的是哪個金鑰,以便將來更新時可驗證使用的是同一個金鑰。即使你跳過了驗證金鑰步驟(這是不安全的),至少這將確保你的更新有相同的簽名者。
當你確信自己擁有的金鑰是正確的時候,你可以這樣匯入它(將luke-jr.asc替換為包含所需金鑰的檔名):
gpg --import < luke-jr.asc
或者如果你只有指紋,像這樣(把你想用的金鑰指紋放進去!):
gpg --keyserver hkp://keyserver.ubuntu.com --recv-key E463A93F5F3117EEDE6C7316BD02942421F4889F
步驟2 :驗證簽名
現在你知道要用什麼金鑰進行驗證了,下一步就是檢查簽名是否有效。
在繼續此步驟之前,必須確保簽名者金鑰的副本是最新的。如果你不這樣做,你可能會收到一條關於金鑰已過期的訊息。執行(使用你所需的指紋):
gpg --keyserver hkp://keyserver.ubuntu.com --refresh-key E463A93F5F3117EEDE6C7316BD02942421F4889F
接下來,(除了你正在檢查的程式檔案之外)你將需要兩個檔案:包含檔案指紋列表的“.assert”檔案和包含該列表簽名的“.assert.sig”檔案。這是因為我們所做的不是對程式檔案本身進行簽名,而是對所有檔案進行指紋識別,然後對該列表進行簽名。因此,這兩個檔案你都是需要的。
Bitcoin Core的“assert”檔案對釋出在這裡:https://github.com/Bitcoin-Core/gitian.sigs/find/master;
Bitcoin Knots的“assert”檔案對釋出在這裡:https://github.com/bitconinkots/gitian.sigs/find/Knots
注意,每個簽名者都有一個單獨的檔案對。如果你正在驗證是否有多個人簽名了你的檔案(你應該這樣做),則需要檢查每個檔案對。此外,你還需要確保自己正在獲取要驗證的版本的檔案!
在列表中找到所需檔案後,單擊連結在瀏覽器中開啟該檔案,然後右鍵單擊“Raw”或“Download”按鈕並選擇“連結另存為”。
一旦你有了這兩個“assert”檔案,你就可以透過執行來檢查簽名(將檔名調整為特定的.assert.sig)
gpg --verify bitcoin-core-linux-0.19-build.assert.sig
如果這步成功了,你就會得到下面的結果:
gpg: Signature made Sun 19 Jan 2020 03:47:15 AM UTCgpg: using RSA key E463A93F5F3117EEDE6C7316BD02942421F4889Fgpg: Good signature from “Luke Dashjr <[email protected]>” [ultimate]
注意金鑰的指紋是粗體顯示的。該指紋必須要和你在步驟1中驗證的金鑰匹配,否則它可能是由其他人簽名的!關於“好籤名”的部分也很重要,而名字和電子郵件地址卻不重要,如果指紋是錯誤的,這兩個都可能是偽造的。
假設一切順利,你現在知道“.assert”檔案是由所述金鑰的控制者提供擔保的,並且可繼續驗證你的實際程式檔案,是否是該“.assert”檔案中列出的。
步驟3:驗證檔案本身
要驗證程式檔案,必須首先對其進行加密雜湊驗證(基本上是提取其指紋)。
這是透過一個簡單的命令完成的(注意替換你正在驗證的實際檔名!):
Linux: sha256sum bitcoin-0.19.0.1.knots20200104-powerpc64le-linux-gnu.tar.gzWindows: certUtil -hashfile bitcoin-0.19.0.1.knots20200104-win64.zip SHA256macOS: shasum -a 256 bitcoin-0.19.0.1.knots20200104-osx-unsigned.dmg
這將輸出如下內容:
d370692590c4546ac0de250da91c6c288d9ee5252f1a4b857a5b80c4e3d81149 bitcoin-0.19.0.1.knots20200104-powerpc64le-linux-gnu.tar.gz
這是檔案內容的指紋,後跟指定的檔名。
現在,在任何純文字編輯器/檢視器中開啟“.assert”檔案,並查詢該指紋。它應該在頂部的“out_manifest”部分,如果你到達了“in_manifest”或“base_manifests”,那麼你已經走得太遠了。
如果你在“.assert”檔案中找到了它,那麼你已經驗證了你擁有的檔案,是與簽名者所擔保的檔案是相同的(你將在指紋右側的“.assert”檔案中看到它們的檔名,它可能與你的檔名是相同的)。
而如果“.assert”檔案中缺少該檔案,則可能表示你使用了錯誤的“.assert”檔案,或者你的檔案是不匹配的(在這種情況下,你將在預期的檔名旁看到另一個指紋)。如果檔案已列出,但有著不同的指紋,請不要開啟檔案,而是儲存它(我們可能會要求您提供副本),並與受影響專案的安全團隊聯絡。