Wallet開発のセキュリティ２（NFC編）

# はじめに

2020年のアドベントカレンダーのネタにWallet開発のセキュリティと言うのを書いたのですが、
その続きです。


NFCに暗号化した秘密鍵を書き出してウォレットで使うと言った事をやってみます。


# 端末と秘密鍵を分けたい。

これは以前から考えている事なのですが、見出し通り分けたいと。

なぜかと言うと、端末に暗号化した秘密鍵はめちゃくちゃ極端にリスクが高いと言うものではないですが一般的な範囲で「携帯のロックは掛けとかないとヤバイ」と言った感じ。（暗号化してあるので現状問題にはなっていませんが。）
このへんは以前の[2020年の記事](https://qiita.com/bootarouapp/items/1b10892a4e29739a2346)見て頂ければ。

結局のところパスワードと言う本人しか知らない情報で本人の秘密鍵か？を確認していますね。

但し端末にロックが無い場合は悪い人に貸したりすると暗号化した秘密鍵は簡単に取られてしまいます。
後はパスワードを破ればみたいな話ですね。（これはインターネット全般に言える話でもありますので過度に不安にならないように）


現状必要なのか？とセキュアか？は置いていおいてＮＦＣをかざして秘密鍵をインポートするのはナウくて痺れるぐらい未来っぽいのでやってみますｗ

# WEB-NFCの対応状況 2022/12現在
ChromeブラウザがAndroid端末のNFCにアクセスできるように
2021/03/02に公開されたChrome89で解放されました。

それ以前はデベロッパーモードなど限定的に開放していました。
ちゃんと使えるようになった☆彡

NFC搭載のAndroid＋Chromeと言う条件ではあります。



# NFCカードじゃなくてNFCリングがおススメ

指輪って直につけるものなので盗まれにくいですし、すでに外に出してあるのですぐに使える。





# 実装方法

ウォレットの実装含めますと長くなるので割愛させていただきます。
概要だけ説明しておきますと、ATMをイメージして頂ければと思います。


キャッシュカードを入れて暗証番号を入力するとすべてのATM機能が一時的にアンロックされる。
↓
NFTリングをかざして暗証番号を入力するとすべてのウォレット機能が一時的にアンロックされる。

利用後は秘密鍵を自動もしくは手動イジェクトで解除（破棄）する。

実装したのはTransactionの送信もしくはNFCの解除ボタンを押すとパージ（秘密鍵削除）されます。
※ここはしっかり安全に作りこむ必要がありそうですね。

内部処理的にはすでにウォレットに登録されているアドレスリストに割り込んで一時的に登録します。
ＮＦＣアドレスがある場合はそれが優先して使われるような処理ですね。

なのでパージすれば元のアドレスリストに戻ります。
ちょっと怖いかもしれませんが、
「ＮＦＣリングがあれば他人の端末でも自分のアドレス（秘密鍵）を使って送信する」
という事が可能です。



今回はNFTDriveEXと言うウォレットを開発運営しているのでそちらに機能追加してみました。
[拡張機能版](https://chrome.google.com/webstore/detail/nftdriveex/oodjpaddnaphopckiphmgapkafegcghl?hl=ja&authuser=0)と[ユニバーサル版(WEB)](https://nftdrive-ex.net/)があるのですがユニバーサル版でAndroidでテストしてみます。


# 使い方

[こちら](https://bootarou.xsrv.jp/nfcwallet/)に別途NFC対応版を公開ましたのでアクセスしてください。

Android+Chromeでお願いします。

【はじめに】
下記の記事をを参考に通常の手順でセットアップ＆アドレスを作成してください。
[NFTDriveEXユニバーサル版セットアップ](https://note.com/tender_echium972/n/n94b0f7e31e4e)

※初回にメインネットのアカウント作成を１つ作成した後はテストネットに切り替えてアカウント作成を行うとテストネットのアカウントを作成することができます。メインネットを選択して作成するとメインネットのアカウントになります。

※書き出しを行いそのアカウントを削除する場合は最低でも１つはアカウントが残るようにしてください。
登録アカウントがゼロの場合はアクティベート画面が表示され利用できません。



【NFCへの書き込み】

1.設定から書き込むアドレスを初期アドレスにセットします。

<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/eca0ab2d-dc8f-e5d0-19c9-876eafdc48bc.jpeg>


2.設定からNFCExportを押します。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/6cb8a644-6c2f-5c95-90cf-c9c58ba3f231.jpeg>


3．作成時に入力したアドレスのパスワードを入力します。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/6215e910-c6d6-704f-9dc8-136225b2bef7.jpeg>


4．OK押してくださいと出るので押します。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/24c872cf-3e63-9246-54b7-59b600326140.jpeg>



5．NFTカードまたはリングと接触させます。

6．書き込み完了が出ればOKです。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/7e38958e-cdac-0ff2-50d3-aec08ca443f7.jpeg>

7.必要に応じて設定から秘密鍵のバックアップと書き出したアカウントの削除をしてください。
操作方法は[こちら](https://nemlog.nem.social/blog/78018)の記事を参考にしてください。

以上でNFCに書き込み本体から秘密鍵が消えたことになります。

※順番的に一度読み込みで問題ない事を確認してからアカウントを削除した方が安心かも。

【NFCの読み込み】

1.トップ画面のNFTを押します。



<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/5fef9c5e-4713-0228-e0eb-6f37e0765e38.jpeg>



2.読み取り開始しますと出るのでＯＫを押します。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/d10f7870-8cb4-e075-3762-ee09f1467f1a.jpeg>


3.NFTの部分がグリーンに変わったら読み込みめるのでNFTカードもしくはリングを接触させます。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/a1230e30-1bd9-2e53-0c8a-aeebf1dd4f49.jpeg>


4.アドレスのパスワードを入力してくださいと表示されるので入力します。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/fca0a533-46f7-ae14-fe97-99ef020da51f.jpeg>

5.NFCを読み込みました、と表示されるのでＯＫを押します。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/7a5535e3-9357-4b31-b217-3fe112bb384a.jpeg>



6.画面がリロードされアドレス選択に【NFCADDRESS】が選択されます。NFCボタンが赤色に変わったら成功です。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/6d25159b-9a8f-a64a-70de-6cbad4847008.jpeg>


以上で完了です、あとはＱＲコードなど読み込んでの通常の送金やオファー操作が１度だけ行えます。





【手動で解除】
1.NFTボタンが赤いときにNFCボタン押すと秘密鍵が解除されます。
※解除忘れにはご注意ください。

<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/6d25159b-9a8f-a64a-70de-6cbad4847008.jpeg>


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/be38a268-ce4c-fda7-4c82-cce1b312382e.jpeg>



2.解除後は通常のカラーに戻ります。
※文字カラー設定を赤にしている場合は分かりにくいのでご注意ください。


<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/7b95b881-8178-e3aa-c6f5-f5fa15028ee4.jpeg>



# 無くした時の対応
NFTリングをなくしたときは速やかにバックアップした秘密鍵を一度インポートして別のアドレスに資産を移してください。
無くしたアドレスは利用しないようにご注意ください。




# ユースケース
1.NFCカードさえあればよいので作業のスキームに組み込みやすい。
    
2.端末は共有すれば良いので組織単位で使える。

3.お店側の端末で決済できる。


# 実際使ってみての感想



指に暗号化した秘密鍵があるとういうのは何とも未来っぽくてすごく楽しいです。

「ヤングなカップル」達が「NFC付き結婚指輪」で「婚姻証明書」に署名していく未来が見えました～。

ちなみにこういうハードモードなNFCもあるようなので誰かチャレンジしてくださいｗ
体に埋め込むタイプ。
[https://medihome.jp/technology_nfc/](https://medihome.jp/technology_nfc/)






<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/9af5d175-63fd-0b84-0176-11aeb026399f.jpeg>

<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/0a496e9e-2d24-54b0-a596-35882c51c0b4.jpeg>

ありがとうございました。



<img width=300px src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/5f3c1cca-75a1-10ea-b418-90b378e0f6f0.jpeg>