Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
いかにしてビットコインを扱うか / How to handle Bitcoin in Android
Search
Yuiki
February 07, 2019
Technology
3.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
いかにしてビットコインを扱うか / How to handle Bitcoin in Android
https://droidkaigi.jp/2019/timetable/70881/
Yuiki
February 07, 2019
Other Decks in Technology
See All in Technology
Agentic Web
dynamis
1
130
OCI Oracle AI Database Services新機能アップデート(2026/03-2026/05)
oracle4engineer
PRO
0
220
探して_入れて_作って_使う_Agent_Skills___LT.pdf
peintangos
2
160
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
2.7k
さきさん文庫の書籍ができるまで
sakiengineer
0
370
Cloud Run のアップデート 触ってみる&紹介
gre212
0
310
電子辞書Brainをネットに繋げてみた(自力編)
raspython3
0
480
タクシーアプリ『GO』の実践的データ活用
mot_techtalk
2
150
LLMを「主役」にしないための 3つの原則
techtekt
PRO
0
120
Dynamic Workersについて
yusukebe
2
590
関西に縁あるMicrosoft MVPsが語るCopilotの未来
kasada
0
1.2k
「気づいたら仕事が終わっている」バクラクAIエージェント本番運用の裏側 / layerx-bakuraku-aie2026
yuya4
18
10k
Featured
See All Featured
Unsuck your backbone
ammeep
672
58k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Tell your own story through comics
letsgokoyo
1
940
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Making Projects Easy
brettharned
120
6.7k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
960
Navigating Weather and Climate Data
rabernat
0
210
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
370
Skip the Path - Find Your Career Trail
mkilby
1
140
Statistics for Hackers
jakevdp
799
230k
Transcript
いかにして ビットコインを扱うか DroidKaigi 2019 @yuikijp 1
ゆいき / Taiki Uchida > 筑波大学 情報科学類 2年 > Previously
at: @mikan_link @yenom_wallet > Android歴: 5年 > 最近: kotnes, Rust, Flutter > Twitter: @yuikijp 自己紹介 2
アジェンダ 1. ビットコインとは 2. ビットコインをAndroidで扱う上で a. いかにして通信するか b. いかにして秘密鍵を保持するか 3.
Copayウォレット バックドア事件 3
モチベーション ◉ モバイル x Bitcoinの話が少ない ◦ DroidKaigi 初? ◉ ビットコインが生まれて早10年
暗号通貨周りに関しての理解を促進したい 4
ビットコインとは? 1 5
ビットコイン 明示的な管理者無しに P2Pネットワークで 送金できるプログラマブルなお金 6 1. ビットコインとは?
ビットコインを支える技術 ◉ ブロックチェーン ◉ Proof of Work (PoW) ◉ 公開鍵暗号
◉ 楕円曲線デジタル署名アルゴリズム (ECDSA) ◉ ハッシュ関数 (SHA-256) ◉ マークルツリー ◉ Simple Payment Verification (SPV) ◉ etc... 7 1. ビットコインとは?
詳しく知りたい方は Mastering Bitcoin Web (無料) https://bitcoinbook.info/ 本 https://www.amazon.co.jp/dp/4757103670 8 1.
ビットコインとは?
暗号通貨系のアプリ 9 1. ビットコインとは?
暗号通貨系のアプリ ◉ 取引所系…法定通貨と暗号通貨などを交換する取引所が出 しているアプリ ◉ ウォレット…暗号通貨を保持、送受金する機能を持つ ◉ DAppsブラウザ…ブロックチェーン等で動くアプリを使う ためのウォレット内蔵型専用ブラウザ ◉
etc... 10 1. ビットコインとは?
共通の問題 11 1. ビットコインとは?
共通の問題 ◉ いかにして通信するか ◉ いかにして秘密鍵を保持するか 12 1. ビットコインとは?
いかにして通信するか 13 2
そもそも何を通信するのか 14 2. いかにして通信するか
通信内容 トランザクション (+α) ◉ 送金/コントラクトの実行→トランザクションの作成、送信 ◉ 着金→トランザクションの受け取り ◉ 残高確認→トランザクション履歴の取得 ◉
etc... 15 2. いかにして通信するか
主なウォレットの種類 ◉ フルノード型 ◉ SPV クライアント型 ◉ API クライアント型 16
2. いかにして通信するか
フルノード すべてのブロックとトランザクションを取得し て検証するノード ◉ ブロックチェーンの全ての情報を保持してい る ◉ 現時点で200GB程度の空き容量が必要 主な実装: Bitcoin
Core - https://github.com/bitcoin/bitcoin 17 2. いかにして通信するか
SPVクライアント モバイル環境等でも利用可能なようにした軽量 クライアント ◉ 自分に関係するトランザクションを一部検証 する ◉ ブロックヘッダを保持する(40MB程度) 主な実装: bitcoinj
- https://github.com/bitcoinj/bitcoinj 18 2. いかにして通信するか
API クライアント フルノードをREST API等を経由して利用する 主な実装: (クライアント) copay - https://github.com/bitpay/copay (サーバ)
bitcore - https://github.com/bitpay/bitcore 19 2. いかにして通信するか
通信方法の比較 方法 サイズ 通信量 検証 フルノード ☓ (200GB) ☓ ◎
SPV クライアント ◦(40MB) △ ◦ API クライアント ◎ ◎ ☓ 20 2. いかにして通信するか
どれをつかえばいい? アプリで使うなら容量や通信量の関係上、SPVかAPIクライアント 自社のサーバだけ依存させずにビットコインネットワークのメ リット(分散)を活かすならSPVクライアント 自社ですべてハンドリングしたい場合はAPIクライアント SPVとAPIのハイブリットという手もある 21 2. いかにして通信するか
ところで… 22 2. いかにして通信するか
bitcoinjで送金 (SPV) 23 val kit = WalletAppKit(TestNet3Params(), File("."), "") //
セットアップを開始する kit.startAsync() // セットアップを待つ kit.awaitRunning() // 残高 val balance = kit.wallet().getBalance() // アドレス val address = kit.wallet().currentReceiveAddress() // 送金 kit.wallet().sendCoins(kit.peerGroup(), "address", Coin.COIN) bitcoinj - https://github.com/bitcoinj/bitcoinj チュートリアル作りました ! - https://hackmd.io/s/HyTPzbeLm 2. いかにして通信するか
SPVの改良 信頼性は落ちるが接続数を減らして通信量を減らす BRDは3 https://github.com/breadwallet/breadwallet-core/blob/master/BRPeerMana ger.h#L40 bitcoinjは12 https://github.com/bitcoinj/bitcoinj/blob/2ec193f8479425c3a66bebf5f2d3 493e39e88f7c/core/src/main/java/org/bitcoinj/core/PeerGroup.java#L82 24 val
kit = object : WalletAppKit(params, dir, filePrefix) { override fun createPeerGroup(): PeerGroup { return super.createPeerGroup().apply { maxConnections = 8 } } } 2. いかにして通信するか
着金通知 ユーザの公開鍵をサーバで保持して、サーバ上 で着金確認を行い、Push通知を送る。 実装例: https://github.com/bitpay/bitcore/tree/master/packages/bitcore-wallet-service 25 2. いかにして通信するか
いかにして鍵を保持するか 26 3
そもそも鍵が何故必要か 27 3. いかにして鍵を保持するか
ビットコイン x 鍵 秘密鍵から不可逆変換でアドレスが生成される そのアドレス宛に送金されたコインは、そのア ドレスと紐づく秘密鍵による署名が無いと利用 できない。 28 3. いかにして鍵を保持するか
ビットコイン x 鍵 秘密鍵から不可逆変換でアドレスが生成される そのアドレス宛に送金されたコインは、そのア ドレスと紐づく秘密鍵による署名が無いと利用 できない。 つまり、秘密鍵=コインの所有者 29 3.
いかにして鍵を保持するか
鍵の管理法 ◉ サーバで持つ ◉ クライアントで持つ 30 3. いかにして鍵を保持するか
鍵の管理法の比較 管理場所 観点 特徴 サーバ 事業者 サーバがハックされるリスクを背負 う ユーザ 事業者を信頼して、鍵の管理を任
せる (バックアップをおまかせできる ) クライアント 事業者 サーバで鍵を管理する必要がない ユーザ 自分で鍵を管理する (バックアップが大変) 31 3. いかにして鍵を保持するか
今回はクライアントで鍵を持つ話をします 32 3. いかにして鍵を保持するか
Android KeyStore 33 3. いかにして鍵を保持するか
Android KeyStore ◉ 安全な領域で鍵を生成、保持できる 34 3. いかにして鍵を保持するか
Android KeyStore ◉ 安全な領域で鍵を生成、保持できる ◉ しかし、iOSのKeyChainと違ってAndroidのKeyStoreには 任意のデータを入れることができない ◉ アンインストールや指紋の登録解除等で消える 35
3. いかにして鍵を保持するか
36 3. いかにして鍵を保持するか
鍵の持ち方 37 3. いかにして鍵を保持するか
鍵の持ち方 おすすめのものを列挙しているわけではありません。プロダクト毎にセキュリティリスク を考慮して検討してください。あくまで例です。 ◉ 内部領域にそのまま保存する (copay) ◉ 十分な強度のパスフレーズで鍵を生成し、内部ストレージに保存 する(BIP39) ◉
KeyStoreの鍵で暗号化して内部領域に保存する (BRD/Toshi) ◉ ユーザが所持しているデバイス(セキュリティトークン等)で暗号 化する ※ SafetyNet Attestation APIを用いてRoot化検知 https://developer.android.com/training/safetynet/attestation 38 3. いかにして鍵を保持するか
将来的な鍵の持ち方 ◉ 端末レベルで暗号通貨鍵の管理、署名が行わ れる未来 ◉ ハードウェアウォレットとスマホの連携 39 3. いかにして鍵を保持するか
4 Copayウォレット バックドア事件 (番外編) 40
Copayウォレット バックドア事件 41 4. Copayウォレット バックドア事件
Copayウォレット バックドア事件 ◉ TypeScript製 マルチプラットフォームウォレット(OSS) 42 4. Copayウォレット バックドア事件
Copayウォレット バックドア事件 ◉ TypeScript製 マルチプラットフォームウォレット(OSS) ◉ 秘密鍵を奪取するバックドアが仕組まれた 43 4. Copayウォレット
バックドア事件
Copayウォレット バックドア事件 ◉ TypeScript製 マルチプラットフォームウォレット(OSS) ◉ 秘密鍵を奪取するバックドアが仕組まれた ◉ 2018年11月末に発覚 44
4. Copayウォレット バックドア事件
Copayウォレット バックドア事件 ◉ TypeScript&Cordova製 マルチプラットフォームウォレット(OSS) ◉ 秘密鍵を奪取するバックドアが仕組まれた ◉ 2018年11月末に発覚 ◉
アプリが依存しているライブラリが更に依存し ているライブラリに暗号化された悪意のある コードが混入 45 4. Copayウォレット バックドア事件
Copayウォレット バックドア事件 copay event-sream flatmap-stream 依存 依存 46 4. Copayウォレット
バックドア事件
Copayウォレット バックドア事件 copay event-sream flatmap-stream 依存 依存 47 ◉ 広く使われてい
るBTC/BCHウォ レット ◉ 200万DL/週 ◉ 攻撃ライブラリ 4. Copayウォレット バックドア事件
Copayウォレット バックドア事件 copay event-sream flatmap-stream 依存 依存 ◉ 広く使われてい るBTC/BCHウォ
レット ◉ 200万DL/週 ◉ 悪意のあるコー ドを暗号化して 圧縮済みファイ ルに混入 48 ◉ 攻撃ライブラリ ◉ 悪意のある人がメ ンテナ権限を受け 取り flatmap-stream への依存を追加 ◉ event-stream に以前から依存 4. Copayウォレット バックドア事件
ポイント 49 4. Copayウォレット バックドア事件
ポイント 50 多くの人に関係があると言える 4. Copayウォレット バックドア事件
ポイント 51 多くの人に関係があると言える ◉ OSSとは切っても切り離せない開発環境 4. Copayウォレット バックドア事件
ポイント 52 多くの人に関係があると言える ◉ OSSとは切っても切り離せない開発環境 ◉ 趣味等でOSSを開発している人も多い 4. Copayウォレット バックドア事件
ポイント 53 多くの人に関係があると言える ◉ OSSとは切っても切り離せない開発環境 ◉ 趣味等でOSSを開発している人も多い > I created
it for fun https://gist.github.com/dominictarr/9fd9c1024c94592bc7268d36b8d83b3a 4. Copayウォレット バックドア事件
対策 ◉ アプリ開発者としての対策 ◉ ライブラリ開発者としての対策 54 4. Copayウォレット バックドア事件
アプリ開発者 としての対策 55 4. Copayウォレット バックドア事件
アプリ開発者としての対策 copayの対策 ◉ メジャーバージョンアップデート時以外では 依存性のアップデートをしないようにした (依存関係のレビューに時間を割きやすいようにした) ◉ 接続可能なURLを制限した。(Androidネイティブでは難しそう) 56 4.
Copayウォレット バックドア事件
アプリ開発者としての対策 copayの対策 ◉ メジャーバージョンアップデート時以外では 依存性のアップデートをしないようにした (依存関係のレビューに時間を割きやすいようにした) ◉ 接続可能なURLを制限した。(Androidネイティブでは難しそう) その他 ◉
依存ライブラリが多くなりすぎてないかを確認する ◉ メンテされてないライブラリを使わない ◉ ライブラリを支援する(金銭的/時間的) ◉ (依存先のライブラリをウォッチする) 57 4. Copayウォレット バックドア事件
ライブラリ開発者 としての対策 58 4. Copayウォレット バックドア事件
ライブラリ開発者としての対策 ◉ 信用できない人にコミット権限やリリース権 限を与えない ◉ アーカイブするという選択肢もある 59 4. Copayウォレット バックドア事件
詳しくはこちら ◉ I don't know what to say. · Issue
#116 · dominictarr/event-stream https://github.com/dominictarr/event-st ream/issues/116 ◉ Statement on NPM Package Vulnerability in v5.0.2-5.1.0 of Copay Wallets https://blog.bitpay.com/npm-package-vul nerability-copay/ 60 4. Copayウォレット バックドア事件
まとめ ◉ ビットコインとは明示的な管理者無しにP2Pネットワークで 送金できるプログラマブルなお金 ◉ 通信量に気をつける。SPVは通信量が多いので接続数を減ら したり、自社APIサーバを使うなどするのも手 ◉ 鍵の保存はケースバイケース。Root検知とKeyStoreの鍵で 暗号化するのがメジャー
◉ 暗号通貨を扱う上でセキュリティに関しては必ず方針を決め ましょう。OSSライブラリの扱いに注意 61
> Twitter: @yuikijp ありがとうございました 62 Presentation template by SlidesCarnival