Slide 1

Slide 1 text

Nostr でパスキー認証 (NIP-07, nostr-keyx, YubiKey) S. Ota https://iris.to/s_ota Nostr勉強会 #1 2023-03-10 1

Slide 2

Slide 2 text

Nostr: 気軽に参加出来る実験場 プロトコル策定 (NIP) プロトコル実装 秘密鍵を守るためのブラウザ拡張機能 (NIP-07) nos2x, Alby, Nostore, nostr-keyx, etc. 拡張サービス開発 リレーサーバ運用 ドキュメント整備 コミュニティ運営 (この勉強会) 2

Slide 3

Slide 3 text

背景 パスキー認証 3

Slide 4

Slide 4 text

最近パスキー認証が話題 Apple, Google, Microsoft がサポー トを表明 Yahoo! JAPAN (対応済み) KDDI (対応済み) NTTドコモ(2023年3月下旬から) https://www.itmedia.co.jp/news/ar ticles/2301/23/news086.html 4

Slide 5

Slide 5 text

パスキーとは 秘密鍵と公開鍵 Nostr と同じ! https://developer.apple.com/jp/passkeys/ https://wired.jp/article/how-to-use-passkeys-google-chrome-android/ 5

Slide 6

Slide 6 text

パスキー認証 「パスワードを脳に記憶」から「秘密鍵を物理的に所持」へ https://www.yubion.com/post/パスキー(passkeys)ってなんだろう?(後編) 6

Slide 7

Slide 7 text

パスキー認証 秘密鍵で署名してサーバに送り、サーバは公開鍵で署名を検証 ユーザが秘密鍵を直接意識せずに利用出来るよう工夫 生体認証 (指紋, 顔, etc.) セキュリティキーやスマートフォンを物理的に所持 Nostr 秘密鍵で署名してリレーに送り、受信者は公開鍵で署名を検証 現状ではパスキー認証のような工夫はなく、秘密鍵を直接取り扱う必要がある nostr-keyx NIP-07 を実装した Chrome 拡張機能 Nostr においてパスキー認証(に近いもの)を実現 7

Slide 8

Slide 8 text

nostr-keyx Nostr においてパスキー認証(に近いもの)を実現 8

Slide 9

Slide 9 text

Nostr の現状: ワイルドすぎる実験場 秘密鍵がアイデンティティの源泉 誰でも自由に秘密鍵を作成可能 → 権威に頼らない, 公開鍵マイニング, SPAM 秘密鍵を忘れてしまった → アカウント消失, 復活不可 秘密鍵を流出してしまった → なりすまし, 過去のDM全バレ しかも罠がたくさんある 「このサービスを利用するには秘密鍵を入力してください...」がカジュアル 秘密鍵を平文でディスクに保存 秘密鍵( nsec1... )と公開鍵( npub1... )が似ていて間違いやすい 秘密鍵の存在に気が付かずブラウザのキャッシュをうっかり消してしまう 実は初回アクセス時に自動生成されている 秘密鍵を守るためのプロトコルがいくつか提案されている NIP-07, NIP-26, NIP-46 9

Slide 10

Slide 10 text

NIP-07 の仕組み NIP-07: Web ブラウザの拡張機能 Nostr クライアントに秘密鍵を渡さずに署 名/暗号化/復号化を行う仕組み nostr-keyx Chrome 用 NIP-07 実装 OS標準のキーチェーンに秘密鍵を保存(暗 号化)し、OSログインパスワードで復号化 YubiKey を利用してパスキー認証を実現 YubiKey を所持 + PIN で署名可能に https://github.com/nostr-protocol/nips/blob/master/07.md 10

Slide 11

Slide 11 text

セキュリティキー (YubiKey) 多機能 パスキー認証(FIDO2) ワンタイムパスワード(OTP) Google Authenticator 相当 OpenPGP (今回使った機能) gpg コマンドで利用可能 秘密鍵をYubiKey内に保存 署名/検証/暗号化/復号化 YubiKey 5 シリーズ (7600円〜) https://www.yubico.com/products/yubikey- 5-overview/ 11

Slide 12

Slide 12 text

YubiKey で Nostr 秘密鍵を守る 方法1 Nostr 秘密鍵を YubiKey 内に保存 YubiKey 内で署名を計算 残念ながら現状では出来ない(自分が調べた限りでは) YubiKey が secp256k1.schnorr.sign を未実装 方法2 YubiKey 内に OpenPGP の秘密鍵/公開鍵を作成 (RSA or ECC) OpenPGP の公開鍵 で Nostr 秘密鍵を暗号化してディスクに保存 署名を計算するタイミングで OpenPGP の秘密鍵で Nostr 秘密鍵を復号化 Nostr 秘密鍵で署名を計算 結果: YubiKey を PC に挿して PIN を入力(初回のみ)すると署名出来る リスク: 短時間だが Nostr 秘密鍵が PC のメモリ上に平文で存在 12

Slide 13

Slide 13 text

NIP-07 実装比較 拡張機能 nos2x Alby Nostore nostr-keyx nostr-keyx+YubiKey 対応ブラウザ Chrome(*1) Chrome,Firefox,Safari Safari(iOS/macOS) Chrome Chrome 秘密鍵の保存場所 ローカル クラウド ローカル OSキーチェーン ローカル(*2) 秘密鍵の暗号化 共通鍵暗号(AES) (*3) OS管理 YubiKey公開鍵暗号 秘密鍵の復号化 独自パスワード (*3) OSパスワード YubiKey所持+PIN インストール 公式ストア 公式ストア 公式ストア GitHub GitHub *1: nos2x-fox という Firefox 版もある *2: YubiKey の公開鍵で Nostr の秘密鍵を暗号化してローカルディスクに保存 *3: 次バージョンで Apple Keychain に対応予定 NIP-07 実装一覧 https://github.com/aljazceru/awesome-nostr#browser-extensions 13

Slide 14

Slide 14 text

まとめ: nostr-keyx 秘密鍵を守る NIP-07 Chrome 拡張機能 OS標準のキーチェーンで秘密鍵を暗号化 YubiKey で秘密鍵を暗号化 パスキー認証(に近いもの)を実現 https://github.com/susumuota/nostr-keyx 是非試してみてください。コメントや もよろしくお願いします! 謝辞: Segment(gpsnmeajp)さん、ありがとう ございます! https://iris.to/s_ota 14

Slide 15

Slide 15 text

付録 発表時間の都合で省いたスライド 15

Slide 16

Slide 16 text

秘密鍵を守る必要性 秘密鍵がアイデンティティ 誰でも自由に秘密鍵を作成可能 → 権威に頼らない, SPAM 秘密鍵を忘れてしまった → 消失, 復活不可 秘密鍵を流出してしまった → なりすまし, 過去のDM全バレ 秘密鍵流出を Twitter で言うと... IDとパスワードと2要素認証が流出し、復旧用のメールも乗っ取られた 秘密鍵の管理はユーザに任されている 秘密鍵を長期間安全に保持出来るかが重要 秘密鍵を平文のままディスクに保存していると流出のリスクが高い PC紛失/廃棄, バックアップディスク, クラウドストレージ, etc. 16

Slide 17

Slide 17 text

Nostr の秘密鍵/公開鍵とは 秘密鍵: 32バイトの疑似乱数 公開鍵: 秘密鍵から楕円関数を使って計算 (32バイト) 秘密鍵から公開鍵の計算は容易だが公開鍵から秘密鍵の計算は非常に困難 離散対数問題 export function generatePrivateKey(): string { return secp256k1.utils.bytesToHex(secp256k1.utils.randomPrivateKey()) } export function getPublicKey(privateKey: string): string { return secp256k1.utils.bytesToHex(secp256k1.schnorr.getPublicKey(privateKey)) } アルゴリズムの詳細は BIP-340 を参照 https://bips.xyz/340 https://github.com/nbd-wtf/nostr-tools/blob/master/keys.ts 17

Slide 18

Slide 18 text

Nostr における秘密鍵の役割 署名 全ての Nostr イベントに署名を付け、改ざんされていないか検証可能に 楕円曲線DSA(ECDSA), secp256k1, Schnorr 署名 NIP-01, BIP-340 参照 暗号化/復号化 2ユーザ間でダイレクトメッセージをやり取りする ディフィー・ヘルマン鍵共有(DH), NIP-04 参照 NIP-04 はそれほど安全ではないので注意 ( Security Warning 参照) https://www.jipdec.or.jp/project/research/why-e-signature/public-key-cryptography.html https://github.com/nostr-protocol/nips/blob/master/01.md https://github.com/nostr-protocol/nips/blob/master/04.md https://bips.xyz/340 18

Slide 19

Slide 19 text

NIP-07 実装一覧 https://github.com/aljazceru/awesome-nostr#browser-extensions 19