ビットコインの公式クライアントであるBitcoin Coreの新バージョン0.13.0が数時間前にリリースされました。このバージョンではSegwitのコードが初めて含まれることとなりますが、コードが含まれているだけでまだ有効化はされていないので、実質的なSegwitの実装は0.13.1になるものと思われます。
ところで、0.13.0のリリースの数日前にbitcoin.orgに謎の警告文が掲載されました。主な内容は、国主導(中国政府?)のアタッカーがBitcoin Coreのバイナリ(実行ファイル)を攻撃する恐れがあるから注意してダウンロードして使用するように、というようなものです。ただし、この警告文はbitcoin.orgの共同管理者の一人であるCobraという人の一存で勝手に掲載されたもので、表立ってなにか脅迫文なようなものが送られてきたというような情報は一切明らかになっておらず、なぜいきなりこのような警告文を乗せたのかは不明です。
とはいえ、仮に脅迫のようなものがあってもなくても常にbitcoin.orgのようなウェブサイトがハッキングされてBitcoin Coreの実行ファイルが改ざんされる恐れは常にあるので、この記事ではダウンロードしたファイルが改ざんされていないかどうかを検証する方法を書きたいと思います。
実際にここまでやっている人はほとんどいないですし、通常のユーザーは検証する必要もないと思いますが、ハッシュを計算したり電子署名を検証したりとビットコインの基礎的な技術とも関係するので暇なときに試しても面白いと思います。
(お金が直接関係するソフトなので理想を言えばやったほうが良いですが、手間を考えると非現実的なので、更新直後にダウンロードするのではなくしばらく待ってから何らかのトラブルがないか身近なコミュニティで確認した後にダウンロードすると良いでしょう。)
なお、記事を書いている時点ではBitcoin Core 0.13.0のビルド(ソースコードから実行ファイルを作成する手順)後のものがまだ公開されておらずインストーラー等は準備されていないので、0.12.1を例にします。
①Bitcoin Coreをダウンロード
好きなところから自分のOSに合ったBitcoin Coreをダウンロードします。Bitcoin.orgでは以下のURLにまとめて保存されています。
②署名をダウンロード
ダウンロードしたソフトが改ざんされていないことを証明する署名をダウンロードします。先ほどのURLにある「SHA256SUMS.asc」です。
ファイルをメモ帳などで開くと、以下のようにBitcoin Coreのファイルのハッシュ値が署名に添えて書かれていることが分かります。
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 abf0e7336621250702d7a55487c85b8de33c07a30fbc3ecf7f56c97007fcb4ce bitcoin-0.12.1-linux32.tar.gz 54aca14b7512801ab78cc93f8576e1b66364a890e8017e8a187e4bf0209fd28c bitcoin-0.12.1-linux64.tar.gz 91d14dcb9b88ca845df450ceb94250bb5c9a0d514d8ca0c55eb480d0ac77ef32 bitcoin-0.12.1-osx64.tar.gz e1bc86d24dd978d64b511ada68be31057c20789fb9a6a86c40043a32bf77cb05 bitcoin-0.12.1-osx.dmg 08fc3b6c05c39fb975bba1f6dd49992df46511790ce8dc67398208af9565e199 bitcoin-0.12.1.tar.gz fba73e4825a6421ce6cc1e48b67ff5f2847ae1b520d26272e69f7f25de4f36d1 bitcoin-0.12.1-win32-setup.exe 148fb438a32f1706a366a7825bbc5e770e5f9a20e5694f724a443275976a0791 bitcoin-0.12.1-win32.zip c6e06f90e41c36c9a447f065952869e2d7d571ab34b86d061ae19ec25b2799d4 bitcoin-0.12.1-win64-setup.exe d8e1ab9ff65b79c130ec6af8e36626310ffdaf6aacb7a40cfb76e7a63bdfcfd5 bitcoin-0.12.1-win64.zip -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAEBCAAGBQJXEIwgAAoJEJDIAZ42wulkXNcP/Re0iawPi8muiq6J36ZUZKws KL2nwjCImj91on8wGoTUir1IytuIafA4JMHslos2Ak3za2UKAEZrEfx0dXm/FVql AgRneYLYedMQ8127UkSho4rxuwjB3h2gR/FGPpPT0PmbNTWOFsKtV1V9zwsCeA9Q br/ly2BfZHWsS1tpSK5ukP5W0q+Ii2fO4pcfaAsS2y/gc5kyj5hTiKQivwBVXoVA cyH1splq1foM5BYwOuT/cUKGrpA8fWo7+xOaEhhFBlW0oJaSXcNSK9mVTSI/dQ/2 lINXcWBtotnH6/evS35pAIOe4PHg/URhXNT/Sdfwts4YL5nMtF+SPBrJWadPvx3C qdSDZKMuM0cDjVg1F4rjoWAxyshWNKKU2J+qkNUBZ1LbpVyDR3Gl4LFwRjaw0wyZ n6zHonPCtp33ErhsaY0GryHV1pKvL1h6uyDNWHbYpKny4F+TvbyQ6XNVHrx1IAn5 +9UMPB3Q962/8hrRqK95Cs6AJ/D1Wdw9rwEqOC48waDzttYCVknn4L6rGECDdRM4 6pbWNTf3m9lzThWjiuEdNnPoNuKoBD9/UHWW/WRHjT6tbcGqstoyRKTsi8jjmwnC 9g4xWRsTdqYIAL4PBv32T+QYW/YcyRNTT97t/M0aukXxxxjCObehWVmBXVeNn0/9 lvvCgGgSJXtJHxzqcJ2I =a2/6 -----END PGP SIGNATURE-----
③Bitcoin Coreのファイルのハッシュ値を確認
続いてSHA256によりハッシュ値を計算します。Windowsの場合は、コマンドプロンプトを開いて作業用のフォルダに移動した後「certUtil -hashfile bitcoin-0.12.1-win64.zip SHA256」などと入力します。
※Macの場合は「shasum -a 256 bitcoin-0.12.1-osx.dmg」、Linuxの場合は「sha256sum bitcoin-0.12.1-linux64.tar.gz」など。Windows含めてOSのバージョンによっては違うかもしれません。
すると、ハッシュ値が表示されるので②に書かれているハッシュ値と一致するかどうか確認します。一致していれば改ざんされていないと確認できます。
④署名が正しいことを確認する
簡易的な確認であれば、③までで十分ですが、②内のハッシュ値が改ざんされている可能性もゼロではありません。そこで②のファイルも正しいかどうか確認します。
④-1:検証のための準備
検証のためにGnuPGという公開鍵暗号方式の暗号化ソフトを利用します。各OSごとにバージョンが用意されているので好きなものをダウンロードしましょう。
https://www.gnupg.org/download/index.html
ダウンロードしたらインストールします。Windowsの場合、KleopatraというGUIソフトも同時にインストールされますが、基本的にはコマンドプロントからコマンドをうって利用することになります。
④-2:PGP公開鍵をダウンロード
②のファイルはBitcoin Coreの開発者の一人であるWladimir van der Laanにより署名されています。そこで彼のPGP公開鍵をダウンロードします。
https://bitcoin.org/laanwj-releases.asc
上のURLのようにBitcoin.orgにもアップロードされていますが、ハッキングされて改ざんされる可能性も考えて複数の場所からダウンロードして確認するのが理想です。
④-3:公開鍵をインポート
先ほどダウンロードした公開鍵をインポートします。コマンドプロンプト(ターミナル)を開いて作業用フォルダに移動した後「gpg --import laanwj-releases.asc」と入力するとインポートされます。
④-4:②の署名ファイルを検証
続いて②の署名ファイルが正しいか検証します。「gpg --verify SHA256SUMS.asc」と入力します。正しければ「Wladimir~(中略)~からの正しい署名」と表示されます。不正な場合は「不正な署名」と表示されるはずです。
ちなみにこの際、この鍵は信用できる署名で証明されていません!という警告が表示される場合がありますが、自分自身の鍵を作成していないために発生する警告文なので、ファイルの改ざんを確認するだけの用途であれば無視して構いません。
⑤複数人の署名を確認する
一応は④までで完了ですが、Bitcoin Coreは信頼性を高めるためにGitianという方法により複数人のグループによってビルドされています。そこで、先ほど使用したWladimir van der Laan以外の署名を確認することも可能です。
それぞれの署名は以下のgithubのページに保管されています。
https://github.com/bitcoin-core/gitian.sigs
各バージョン、OSごとに分かれており、特定のバージョンのフォルダを開くと署名した人ごとにフォルダが分類されているのが分かります。最下層には生のファイル(拡張子:assert)と署名ファイル(拡張子:sig)があるので、両方をダウンロードします。生のファイルは②と同様にBitcoin Coreのハッシュ値がかかれています。
署名をした人のPGP公開鍵を④-2のようにダウンロード、インポートして「gpg --verify bitcoin-win-signer-build.assert.sig bitcoin-win-signer-build.assert」と入力すれば検証が行われます。
PGP公開鍵は各自探してくださいとしか言えませんが、bitcoinのgithubのページにもまとめて保存されているので参考にしてみてください。
https://github.com/bitcoin/bitcoin/tree/master/contrib/gitian-keys
(4か月前に移動されたばかりで今後も場所が変わる可能性があるのでご注意を)
他のソフトについて
本記事では実際にウォレットとして使っている人はほとんどいないであろうBitcoin Coreの例を紹介しましたが、他のソフトでもふつう署名やハッシュ値も同時に公開されているので、同様の手順で改ざんされていないか検証を行うことができます。
例えばElectrumの場合も以下のダウンロードページに署名(signature)が添えられています。
https://electrum.org/#download
Electrumの場合は、Bitcoin Coreと違いハッシュ値が署名ファイルには表示されていませんが、「gpg --verify electrum-2.6.4.exe.asc electrum-2.6.4.exe」などと入力すれば署名と実行ファイルを検証することができます。
もちろん事前に署名者のPGP公開鍵もインポートしておいてください。Electrumは製作者のThomasVによって署名されており、Electrum関連の人の公開鍵はgithubにまとめられているので参考にしてください。