NIP-07 Extension で秘密鍵が平文で保存されている件ですが、例えば nos2x では以下のファイルに秘密鍵が平文で保存されています(macOS の場合。Windows は %APPDATA%\Local\Google\Chrome 内にあるはず)。
% cd ~/Library/Application\ Support/Google/Chrome/Default/Local\ Extension\ Settings/kpgefcfmnafjgpblomihpgmejjdanjjp
% cat 000003.log
private_keyB"1ac49ce7f5eab04de1df56f9a3b1165d79a77237f76953f611a6d4c2c586ad3a"
秘密鍵が平文でファイルに保存されていると、ディスクのバックアップを取るとそのままコピーされてしまうので、現在使っているディスクだけでなくバックアップディスクの取り扱いにも注意が必要になります。
sat 送っていただいた方、ありがとうございます!
自由度高そうなので Chrome Extension であれこれやるより、こっちのが良さそうですね。macOS の Keychain とかと繋げられないか試してみます!
NativeMessaging というのは初めて聞きました。調べてみます :D
NIP-07 を実装したミニマルな Chrome 拡張機能 nostr-keyx に、秘密鍵をAES(共通鍵)で暗号化して保存する機能を追加しました。
秘密鍵を平文ではなく暗号化した状態で `chrome.storage.local`(ファイルシステム)に保存するので少し安全になるかもしれません。AES鍵(共通鍵)は `chrome.storage.session` (メモリ)に保存しています。
- 秘密鍵を暗号化するための AES-GCM 暗号を追加(共通鍵)
- 秘密鍵とパスワードを設定するためのポップアップメニューを追加
Bech32 (`npub...`) から hex に変換するスクリプトを追加しておきました。
https://github.com/susumuota/nostr-keyx/blob/main/bin/npub2hex.ts
npx ts-node-esm bin/npub2hex.ts "nsec..."
npx ts-node-esm bin/npub2hex.ts "npub..."
秘密鍵は環境変数に入れておいたほうがシェルのヒストリに残らないので少し安全かもしれません。
npx ts-node-esm bin/npub2hex.ts $NOSTR_NSEC
npx ts-node-esm bin/npub2hex.ts $NOSTR_NPUB
`chrome.storage.local` が安全かどうかとは別に、秘密鍵を平文であれこれやってるとちょっとしたケアレスミスでどこかに表示されたりするのが怖いです。コマンドヒストリやログなど。
ちなみに nos2x も平文で `browser.storage.local` に置いているので同じリスクがあります。
やはり秘密鍵を平文で `chrome.storage.local` に置くのは危険なので、取り急ぎ共通鍵で暗号化して、共通鍵はメモリに載せておくことにしようかと思います。 `chrome.storage.session` というのが使えそう。
https://developer.chrome.com/docs/extensions/reference/storage/#storage-areas
共通鍵は当面 Chrome を起動する度に UI から入力させるとかかな。macOS の Keychain が使えるといいんだけど...
とりあえず nostr-tools (中身は noble-secp256k1) で自作のスクリプトを作りましたが、JavaScript なので遅いと思います。
https://github.com/susumuota/nostr-exp/blob/main/keygen.ts
rana の存在は後から知りました :D
6文字は GCP の e2-micro (2 vCPU)で半日程度でした(運がよかった)。5文字なら数時間程度なので、5文字でループ回して6文字目はガチャという感じでやりました。
NIP-07 を実装したミニマルな Chrome 拡張機能を公開しました。この拡張機能を使うと Iris や Snort 等の Web ベースの Nostr クライアントに秘密鍵を渡す必要がなくなります(少し安全になる)。
- ソースは 200 行程度
- 読みやすい(はず)
- 最小限の依存関係 (@noble/secp256k1 と @scure/base のみ)
Hello!