Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
いかにしてビットコインを扱うか / How to handle Bitcoin in Android
Search
Yuiki
February 07, 2019
Technology
3.4k
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
SLOを阻む不安
sraku2159
0
220
AIエージェントに業務知識を届ける仕組みづくり - Knowledge Catalogを活用した知識基盤の構築
hekuchan
0
130
You Have Agency(サンキュー、Ruby)
snoozer05
PRO
5
680
これだけは抑えておきたい!後悔しない re:Invent の過ごし方 / AWS re:Invent 2026 prestudy
kinunori
2
700
Content Mapper APIの応用例~CSS Modules、言語ファイル~
uhyo
2
580
200人の配信コメント、 全部Jevが仕分けます 〜 マサカリガードを作ってみた 〜
katayamatg
1
530
2026 Apache Flink Community Checkpoint
rmetzger
0
170
IoTとは〜? 数字で見るSORACOM UG【SORACOM UG Explorer 2026】
soracom
PRO
0
170
PostgreSQL オプティマイザ統計の秘密
nori_shinoda
0
320
渡米前の準備を制す!re:Invent 2026徹底準備術 / The Ultimate Preparation Guide for re:Invent 2026
yuj1osm
1
540
Maestro MCPとClaude Code Skillsによる自律的なE2Eテスト支援
asmz
0
410
新米を「売り越さない」、Aurora DSQLで作る在庫ゼロ死守の限定ドロップEC
yama3133
0
170
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
970
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Darren the Foodie - Storyboard
khoart
PRO
4
4.1k
Why Our Code Smells
bkeepers
PRO
340
58k
GraphQLとの向き合い方2022年版
quramy
50
15k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
280
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
760
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.7k
The untapped power of vector embeddings
frankvandijk
2
2k
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