擬似生体認証を独自実装してみた

# この記事について
この記事は[KLab AdventCalendar 2016](http://qiita.com/advent-calendar/2016/klab)の12/06の記事です。
大阪でゲームのサーバーやパイプラインツール等を作ってます **わんこ。** です。よろしくお願いします。
前回12/05の記事は @gam0022 の[Emscriptenを使ってブラウザ上でレイトレする](http://qiita.com/gam0022/items/6a1fb3e6946da1a3d7e5)です。

---
### 注意事項

* この記事に記載されていることは個人の実験として行っていることの記録です。
* 行為自体推奨するものでは決してありません。事故やトラブル、一切責任を負いません。
* また安全性や耐久性などの面において保証する内容でもありません。
* 技術的な質問やその他本質と関係のないご質問、コメントにはお答えしない場合もあります。ご理解ください。

---
# では本編

---
### 前置きが長くなりましたが
みなさん、生体認証ってご存知ですよね。
そう。男の子の心くすぐる系のあれです。あれ。

---
## 生体認証 とは
### Biometric Authentication
>生体認証（せいたいにんしょう）はバイオメトリック（biometric）認証あるいはバイオメトリクス(biometrics)認証とも呼ばれ、人間の身体的特徴（生体器官）や行動的特徴（癖）の情報を用いて行う個人認証の技術（プロセス）である。 

 [Wikipediaより](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2 "by Wikipedia")

---
### 生体認証のいいところ
* かっこいい
* 失くさない(忘れない)
* 悪用されにくい
<br><br>

---
### 生体認証のダメなところ
* 任意に変更ができないので一度情報が漏洩するとどうしようもない
* 意図しない変化があることも多い (成長や事故
* 偽陽性と偽陰性のトレードオフである認証方式が多い (100%の精度にするのが難しい
* 個人開発で対応するには機材とか大変

---
# どんな認証を実装するか

---
### 生体認証のダメなところ潰す
* (ある程度)任意のタイミングに認証情報を変更することが出来る
* 認証精度は甘いが意図しない変化はない
* 完全一致型の認証が可能（偽造難度は低い
* 指紋やら、虹彩、静脈読み取り用の機械なんて買えないおとーちゃんのお小遣いでもなんとかなる

---
### NFCタグを手の甲に埋め込んでみた
* 取り出して別チップを埋めれば変更できる
* NFCタグのUID(シリアルナンバー)やデータセクタに格納されたデータで認証するので生体情報を扱わない
* 人為的なデジタルデータなので事前情報交換等で完全一致認証が可能
* 安い。実験用のテストタグとかも安い

---
### この辺にNFCタグが埋まってます
![hand.png](https://qiita-image-store.s3.amazonaws.com/0/55261/28e6b39d-533e-7edb-93e0-c013810862b1.png)

---
### 埋まっているNFCタグは？
* 強化ガラスで覆われた米粒程度の大きさ
* 規格は[MIFARE](https://ja.wikipedia.org/wiki/MIFARE) Standard (Classic) 
* ISO/IEC 14443 (RFID) Type A
* 1444３にNXP独自のアルゴリズム非公開の認証と暗号化プロトコルを採用している
* 容量1024byte

---
### アプリを使って読んでみた
<img wicth="640" src="https://qiita-image-store.s3.amazonaws.com/0/55261/5ace15f3-2f08-f4d2-5c28-70fcfabb0bc4.png">


---
### とっても扱いにくい
* 最近のスマホはNXPチップセットのリード/ライトに対応していないことがほとんど
* でもNexus5XはNXP対応のチップが載っているので読み書き可能！やったね!
* 設置型リーダーライターの場合、書き込み時に手首が曲がってはイケない方向に曲がりそうになる

---
# 実践してみる

---
## やってみたこと
* SmartLockでの信頼出来る端末設定/解錠
* 読み取り時にfacebookや[Qiita](http://qiita.com/wanko)に飛ばす
* デジタルドアロックの解錠
* 挨拶ロボット

---
### SmartLock設定
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">SmartLockの設定 NFCタグ編 <a href="https://t.co/5C3NNn9g2W">pic.twitter.com/5C3NNn9g2W</a></p>&mdash; わんこ。 (@voidofglans) <a href="https://twitter.com/voidofglans/status/806028496153645056">2016年12月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

---
### SmartLock解錠
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">SmartLockの解錠 <a href="https://t.co/YzlHImw2uS">pic.twitter.com/YzlHImw2uS</a></p>&mdash; わんこ。 (@voidofglans) <a href="https://twitter.com/voidofglans/status/806028416617062400">2016年12月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

---
### 読み取り時にfacebookや[Qiita](http://qiita.com/wanko)に飛ばす
* あまりにも対応できる端末が少なすぎて挫折
* 本当は名刺代わりにピッってしてほしかった…。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">NFCタグでのURIリンク <a href="https://t.co/6MiwF6BUwZ">pic.twitter.com/6MiwF6BUwZ</a></p>&mdash; わんこ。 (@voidofglans) <a href="https://twitter.com/voidofglans/status/806028613598396416">2016年12月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

---
### NFC対応デジタルドアロック
<img width="680" alt="スクリーンショット 2016-12-05 17.59.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/55261/4cb3132b-ea8a-415c-4419-d67271206289.png">

[Amazon](https://www.amazon.co.jp/dp/B00BXVS7AU)

---
### 挨拶ロボット
* 事前に登録されたNFCタグに紐付いた名前を呼んでくれる
* RaspberryPiとArduinoを接続
* …自分しかNFC埋め込んでないし友達もいないことに気づいて解体した
* 三回だけ呼んでもらいました

---
# 実際どう使う？

--- 
## 結局現実的にできること
* UIDでの認証精度で可能なもののみ扱う
* 使う場を限定する

--- 
### UID(シリアルナンバー)のみで認証する
* 4オクテット(≒42億)のUIDなので、生体認証よりかなり精度が悪い
* 他の機器とのアドレスバッティングする可能性
* 8桁の数字コードより少し安心できるレベルなのでPINに毛が生えたようなものとして扱うと◎

---
### 使う場を限定する
* 自宅のRaspberryPiなどにNFCのリーダーライターを接続
* より強度の高い独自のキーや、小さなデータを自由に格納できる
* 読み込んだデータと自作のプログラムを絡めると色々出来る
* 一番自由度高いが、一番難易度も高い

---
### NFCを扱うものたち
* [libnfc](https://github.com/nfc-tools/libnfc) - 超有名なNFCライブラリ。最近はサンプルのバグも減った
* [NFC Shield V2.0](https://www.seeedstudio.com/NFC-Shield-V2.0-p-1370.html) - Arduinoに接続してNFCリーダライターを自作できる
<img width="320" src="https://qiita-image-store.s3.amazonaws.com/0/55261/9e9d7bd3-5552-3a92-5e20-7b19beeca2d8.jpeg">

---
## 埋込み型の課題点
* 大きさ/形状の制限
* 電力問題
* チップの少なさ
* (身体的負担

---
### 大きさ/形状の制限
* 埋め込む場所にもよるが出来得る限り小さい方がよい
* 厚みは6mmを超えてくると埋め込みにくい
* シンプルな形状なほどよい
* 球型や円状などの皮下で動きやすくなるので楕円やカプセル型が望ましい
* よって、アンチコリジョン等の機能は恐らく今後も活用は難しいのでは…？

---
### 電力問題
* 外部バッテリー（かっこいいけど）☓
* 体温による熱発電などは死亡時等に使えない△
* 電磁誘導で稼働◎

---
### チップの少なさ
* 埋め込めるほどに小さな物は種類が少ない
* でも最近みたら [NTAG216](https://www.nxp.com/documents/data_sheet/NTAG213_215_216.pdf)対応のチップがあったので試してみたい
* FeliCaも形状の問題とか考えるとなかなか厳しい
* 小さくても埋め込み用に加工できない場合もある（高圧滅菌とか

---
## 埋め込み型の利点
* 鍵がここにあることがバレない
* なんかちょっと電脳化できた気分になれる
* 合コンでマジックネタとして披露するとウケが良い
* …利点はほぼないですね。

---
# 人体拡張と豊かさ

---
## 今でも沢山事例はある
* ペースメーカー
* 人工眼
* 多指(肢)義手（足）

---
## 人体拡張
* 欠損補填や不能部位治療のためではなく**より豊かになるため**のもの
* バイオプリンターなどの技術も期待
* 本当の意味での拡張、体外への違和感のない装着物(人工皮膚シールとか)で出来る未来はよ
* 身体的リスクのない拡張を安価にできる未来はよ

---
## 世間はそうもいかない
* 特に日本
* ちょっと異形だと騒がれる
* 人間らしく、そしてより豊かに生きるためにはバランス大事

---
# さいごに

---
## 専門家じゃないです
僕はハードウエアの専門でも、まして医療の専門でもありません。
ですので間違いや、よりよい方法等沢山あるでしょう。
教えていただけると嬉しいです。一緒に楽しいこと考えられるともっと嬉しいです。

---
## まとめ
今回埋め込んだNFCタグは規格とか気にせずやってしまったので、次からは気を付けたいです。
NFCの仕様はほんとに色々細かくて追いきれていないので詳しい方教えてください（
来年は人体拡張を使ってもっと面白いことするのが目標です。