Symbolブロックチェーンへトランザクションを発信するアプリケーションを作る上で、避けられないのが秘密鍵の入力です。
トランザクションに対して、署名を行うためにはどうしても必要になります。
考えうる最も安全な方法としては、未署名のトランザクション構造を、秘密鍵を保有させたスタンドアロンな署名専用の機材(別のパソコン、別のスマートフォン、ハードウェアウォレット)へ転送し、署名の後、署名済みトランザクションを取り出し、署名端末ではない端末からインターネットへアナウンスすることです。
取引所やサービスの運営、または個人でも大きな資産を扱う場合であれば、このレベル間で作業をすべきだとは思いますが、一般のユーザーからすると、利便性とのトレードオフにおいては大げさすぎてしまいます。
そのため、アプリケーションに鍵をしてもらい、保持して、署名時に再利用するような選択肢を取ることになります。
(Symbol/NEMのウォレットなどはそうなっています)
しかし、安全に鍵管理を実装するのは、既存ライブラリの組み合わせである程度簡単に実装できるとしても、やはり自作するということは避けたいところです。
そこで、必要十分に安全であると考えられるパスワードマネージャに秘密鍵を記録し、input
に適切な属性を付与することで、安全性と利便性を追求する試みです。
なお、この記事は以前にざっくりツイートしたものを記事としてまとめたものです。
パスワードマネージャに鍵を登録
Google Chromeの「設定画面 > 自動入力とパスワード > Google パスワードマネージャ」を開きます。
「追加」ボタンで次のウィンドウが開くので、それぞれを入力していきます。
ウェブサイト: symbol-cosigner.netlify.app
ユーザー名: {Symbolアドレス}
パスワード: {Symbolアドレスの秘密鍵}
なお、symbol-cosigner.netlify.app
とは「Symbol Cosigner」という、連署名専用アプリケーションです。
詳しく説明はしませんが、分かる人なら雰囲気で使えると思うので触ってみてください。
入力したら、「保存」してください。
アドレスの呼び出し
<input
id="address"
placeholder="例: PDIEJ3OD3SFYNZCQUSEWKY4NRRZUI5LMJPSVLPQ"
class="w-full p-3 border rounded-lg font-mono text-sm border-gray-300"
autocomplete="username"
minlength="39"
maxlength="45"
type="text"
value=""
>
このinput
はautocomplete="username"
属性を付与しています。
これを設定しておくと、パスワードマネージャからユーザー名
を補完することができます。
入力にフォーカスすると、キーボードの上に候補が現れるので、あとはタップするだけで入力することが出来ます。
秘密鍵の呼び出し
<input
type="password"
value=""
placeholder="64文字の16進数を入力してください"
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 font-mono text-sm"
maxLength="64"
autoComplete="current-password"
/>
このinput
はautocomplete="current-password"
属性を付与しています。
これを設定しておくと、パスワードマネージャからパスワード
を補完することができます。
入力にフォーカスすると、モーダルが現れるので、あとはタップするだけで入力することが出来ます。
考察
使い勝手はわりといいんじゃないかと思いました。
普段、パスワードマネージャ自体はそれほどマイナーなものでもありませんし、大多数に使われているはずで十分安全だと思います。
ここではGoogleパスワードマネージャを用いましたが、キーチェーンアクセスやFirefox・Microsoft Edgeパスワードマネージャー、1PasswordやBitwardenのようなパスワードマネージャでも、自動入力のルールに沿えば、同様のことが可能だと思われます。
パスワードマネージャを謳う以上、基本的にはそこに保存したデータは安全に補完されていると考えていいと思います。
必要なら、それらが提供する生体認証、二段階認証を利用してもいいと思います。
そこまでの防御をアプリケーション上で実現するのはほぼ不可能ですので、その意味でも、選択肢として十分ありうる方法ではないでしょうか。
アプリケーション側としては、ただ秘密鍵を入力するインプットさえ作れば良く、
鍵管理を実装することを避ける(サボるともいう)ことができます。
入力された鍵で署名だけすれば、保存する必要も無いはずなので、アプリケーションからの鍵の流出があり得えません。
(アプリケーションが悪さをするということはここでは考えません)
まとめ
オートコンプリート属性のドキュメントへリンクを張っておきます。
なお、ネイティブアプリは門外漢なので、Webブラウザ上での実験しかしておらず、iOSアプリやAndroidアプリでも同様のことができるのかはわかりません。
ただ、GoogleのパスワードマネージャはAndroidアプリにも自動入力を提供してくれるので、同じような手段が可能なのではないかと思われます。
若干の心配事として、アプリケーションのドメインが失効の後に乗っ取られた場合、意図せず入力補完が動作してしまうことがあります。
もし、悪意のある管理者が、罠を仕込んで全く同じUIをデプロイした場合、見分けるのが困難です。
正直対策の使用がないので、サービス終了時には全員削除させることができるような小さなコミュニティやグループ内で用いるのが良いかもしれません。
これがベストと言えるほどのことでは無いとも思っていますが、一つの選択肢として、検討してみる価値は十分あるんじゃないかと思います。