BitHanko
BitHankoはエアギャップ署名できるアプリケーションです。
BitcoinトランザクションをPSBT形式(BIP174)のQRコードでやりとりすることによって、セキュアな秘密鍵での署名を実現します。 スマートフォンで、秘密鍵の読み込み、署名、署名済みPSBTのQRコードの表示など、エアギャップ署名に必要な機能を提供します。
何から守れるか
どこまでエアギャップになるかは、入れる端末によって変わります。自分の使い方に合う行を見てください。
| 使い方 | エアギャップか | 守れるもの | 守れないもの |
|---|---|---|---|
| 使っていないAndroidにSigner Lockdownを入れる | はい。OSが保つ: SIMなし、保存済みWi-Fiなし、Wi-FiとBluetoothの設定は固定、アプリやアカウントも追加できない | あとから入るアプリやアカウント、うっかりネットワークにつなぐこと、USBデバッグとファイル転送 | Androidやファームウェアの脆弱性、これらの設定を無視する無線のハードウェア、改ざんされたAPK |
| 使っていない端末を自分でオフラインに保つ(Androidアプリ、Webアプリ) | オフラインに保っている間だけ | オフラインの間の遠隔からの攻撃 | うっかりオンラインにすること。Webアプリでは、オンラインにしたときに新しいビルドが入ること |
| 普段使いのスマホにWebアプリやアプリを入れる | いいえ。 オンラインの端末です | 他のアプリやサイトに鍵を読まれること: 鍵は署名の間だけ持ち、アプリを離れると消える(Webアプリはオンラインになったときにも消す) | 端末を乗っ取るマルウェア、ブラウザやOSの脆弱性。ホットウォレットと同じ扱いにしてください |
どの使い方でも:
- 確認画面を見てください。 署名の安全は、画面に出る金額とアドレスを確かめることにかかっています。
- 端末に鍵を保存する(アプリの設定方法)と、便利な代わりに、端末とパスコードを持つ人なら開けるようになります。初めの設定では何も保存しません。
- 監査を受けていないソフトウェアです。 少額で使ってください。
技術スタック
このアプリはビットコインの署名に特化したWebAssemblyモジュール群である bitwasm-signerを利用しています。
WebAssemblyを利用することによって、マイコンで実装された署名専用デバイスなどどのような環境においてもバイトレベルで同一な署名ロジックを利用することができ、WebAssemblyによるポータビリティ性を活かした運用・管理しやすい署名ソフトウェアの構築を目指します。
本ドキュメントの右側に表示されているモバイルアプリケーションも、実際のWebAssemblyモジュールを使用して表示されており、実アプリと同じ画面と操作を、テストネットで試せます。 スクロールすると、スマホが各節の画面に切り替わります。スマホの上で Follow app に切り替えると、自分で操作でき、押したボタンに合わせて説明がその節へ移ります。単語を入力するキーパッドなど一部の画面はアプリにだけあり、その節ではスマホは前の画面のままです。デモのアドレスに本物のビットコインを送らないでください。
1. セットアップ
Android、iOSのどちらでも使えます。入れ方は何を信頼するかで選べるので、セットアップ方法を参照してください。AndroidではSigner Lockdownを使うと、SIMを抜いた端末のWi-FiとBluetoothの設定を固定し、Device OwnerとしてUSBデバッグ・アプリやアカウントの追加を禁止した署名専用機にできます。
入れたあとは、設定 › 端末の機能制限 で、画面や入力の内容が漏れるおそれのある状態(ネットワーク、Bluetooth・NFC、サードパーティ製キーボード、USBデバッグ、ユーザー補助サービス)をどう扱うかを選べます。それぞれ、確認しない(オフ)、上に警告を出す(警告)、オンの間は鍵を読み込ませない(必須)から選べます。ブラウザ版には、この確認はありません。
2. 鍵の生成
鍵は12個か24個の英単語の並び(シードフレーズ)です。新しいウォレットを作る を押すと、安全な乱数から単語を作ります。スマホの乱数を信用したくなければ、自分で振ったサイコロの目から作ることもできます。
紙とペンを用意し、周りに人やカメラがない場所で行ってください。
サイコロで作る
サイコロで作るときは、1回振るごとに出た目を押します。12語ならちょうど50回、24語なら99回です。公平なサイコロではほとんど起きない偏りや規則性があると、署名アプリが警告します。
紙に書き写す
単語を順番どおりに紙に書きます。見た人はビットコインを持ち出せます。 この紙があれば、スマホをなくしても取り戻せます。SeedQRを表示 を押すと、単語をSeedQRとしても表示できます。
書いた単語を確かめる
紙に書いた単語を5問のクイズで確かめます。書き間違いがあれば、直せるうちにここで気づけます。クイズに通るまで、新しい単語は署名に使えません。通ると、そのまま署名に使う鍵として読み込めます。
3. 鍵を読み込む
署名アプリは初めの設定では鍵を保存しません。署名するたびに読み込み、ウォレットを閉じるかアプリを離れるとメモリから消します。スマホに保存したいときはそのほかの機能を見てください。
読み込み方は、バックアップのSeedQRを読み取る、単語を入力する、ブラウザ版では テスト用の鍵を使う を押す、の3つです。続いてパスフレーズの画面が出ます。付けていなければ空のまま進みます。読み込むと、ウォレットの画面に鍵の フィンガープリント が出ます。ウォレットアプリに出るものと比べると、両方が同じ鍵を使っているか確かめられます。テスト用の単語では 73c5 da0a です。
単語を入力する
単語はスマホのキーボードではなく、アプリの中のキーパッドで入力します。キーボードに単語を学習されません。どの単語にもつながらない文字は押せず、最後の単語はチェックサムに合う候補だけが出ます。
パスフレーズを使う
単語にパスフレーズを付けると、別の鍵になります。打ち間違えても別の鍵になります。パスフレーズの画面には、パスフレーズなしのフィンガープリントと、入力中のパスフレーズでのフィンガープリントが並びます。控えておいたものと合っているか確かめてから ウォレットを開く を押してください。テスト用の単語では、TREZOR と入れると b4e3 f5ed になります。
12語か24語なら、この画面の SeedQRを表示 で、単語をSeedQRとして表示できます。ウォレットを開くと単語はメモリから消えるので、読み込む鍵のSeedQRを出せるのはこの画面だけです。
4. ウォレットアプリに登録する
ウォレットアプリに登録する を押し、書き出す公開鍵を選びます。ふつうは まとめて書き出す のまま QRを表示 を押すと、公開鍵をアニメーションのQRコードで表示します。ウォレットアプリで読み取ると、ウォッチオンリーウォレットが追加されます。秘密鍵は含まれていません。これは最初に一度だけ行います。xpubだけを読むウォレットアプリには、1種類だけ書き出します。
5. 送る
取引はウォレットアプリが作り、署名アプリが確かめて署名します。
取引を読み取る
ウォレットアプリで取引を作り、QRコードで表示します。取引に署名する を押し、カメラを向けます。ブラウザ版では、カメラの代わりに テスト用の取引を使う で試せます。
支払う内容を確かめる
確認画面に、送る金額、ネットワーク手数料、すべての送り先が出ます。送り先には、相手に送る分と、自分に戻るおつりがあります。ウォレットアプリのアドレスと見比べて1件ずつチェックを入れます。すべてにチェックを入れて最後までスクロールするまで 署名する は押せないので、確認を飛ばせません。
署名を返す
署名した取引がQRコードで出ます。ウォレットアプリで読み取り、ウォレットアプリから送金します。署名アプリがネットにつながることはありません。
6. 使い終わったら
ウォレットを閉じる を押すと、鍵がメモリから消えます。アプリを離れたときも同じです。
そのほかの機能
ウォレットの画面の 高度な機能 から使えます。
- マルチシグを登録する: 送金に複数(3つまで)の鍵が要るウォレットです。登録すると、おつりをおつりとして表示し、ほかのウォレットの入力には署名しません。
- メッセージに署名する(BIP137): アドレスの持ち主であることを示せます。
- BIP85でニーモニックを作る: 同じバックアップから取り戻せる、別のウォレット用の単語を作ります。
設定 の この端末に保存 を選ぶと、12語か24語の鍵を暗号化してスマホに保存し、画面ロックか生体認証で開けます。鍵には名前を付けられ、1件ずつ削除できます。パスフレーズは保存しません。開くたびに入力するので、1つの鍵を別々のパスフレーズで開けます。
次に読む
- Signer Lockdown: Androidのスマホを署名専用にする
- USBで入れる: スマホをネットにつながずに入れる
- FAQ