Arduino で物理パスワードをつくる


Digispark (ATTINY85) の互換品を買って遊んでみた話。

Digispark

Digispark は元々クラウドファンディングで作られた小型の USB 対応 Arduino ということでマイコンとしては AVR の ATINY85 を積んでいる。メモリの容量もそんなに大きくないので短めのプログラムを書き込むので精一杯な感じではある。画像や音楽を格納するほどの余裕は無いし、出力端子も少ないのでそういうのには向いていない。便利なのは、USB HID (Human Interface Device) として使えるところ。つまりは、キーボードとかマウスみたいなものを作るのに使える。ということでサンプルプログラムなどを色々試してみた。
今回購入したのは中国の通販で買える 10 個で 1700 円ぐらいのもの。注文してから一週間ちょっとで届いた。ポストに入るサイズなので受け取りも簡単。クローン品については賛否あるが、個人的にはあまり抵抗もないし、本家で買うと1つあたり 1000 円弱するので、やむ無し。


USBキーボード

USB キーボードを作るときは、適当なスイッチの入力を検出して親デバイスに送れば良い。この時に送信する情報はプログラム次第なので色々とおもしろキーボードが作れたりする。例えば、ボタンを押すとメールアドレスが一発で入力されたり、センサーと繋いで現在の気温を入力したりもできる。Windows でよく使う例のショートカットキー専用キーボードも自作できたりする(ひとつのキーにまとめてしまっても良い)。
キーボード入力が可能といいうことは CUI でコマンドを入力することも可能だ。映画などでおなじみのパソコンに USB メモリみたいなものを差し込むと勝手にプログラムが動作するかっこいいやつも簡単に作れてしまう。データを破壊したり、コピーして盗んだり、書き換えたりも簡単に出来てしまうので気をつけないと前科持ちになってしまう。最近だと所持しているだけでもお縄にかかりかねない。

物理パスワードを作った

今回はパスワードを入力することができる物理パスワードを作製した。概要としては、USB コネクタに差し込むとパスワードの文字を送信する。それだけ。
実際のプログラムは以下の通り。Digispark のライブラリを入れておく必要がある。


#include <DigiKeyboard.h>

void setup() {
  //最初に空打ちしておく
  DigiKeyboard.sendKeyStroke(0);

  //ここで入力している
  DigiKeyboard.println("password");
  
  //必要であれば Enter も入力してくれる
  DigiKeyboard.println(40);
}

void loop() {
  //今回は loop 関数は使わない
  //ボタンを押したときにのみ入力するときはここに処理を書く
}


これを書き込んで、再び差し込むとパスワードが入力される。物理的なボタンを付ける手間を惜しんだのでもう一度入力したいときは、一度抜いてもう一度差し込む必要がある。ちなみに、メモ帳などを開いているときに差し込むとパスワードが平文で表示されてしまう。また、キーロガーみたいなマルウェアには通常のキーボードと同じように読み取られてしまう。なにより、この物理キーボードの致命的な欠点は、落としたり盗まれたりしたらパスワードも盗まれてしまうところにある。記憶の中身は取り出せないが、このパスワードは容易に奪われる危険がある。ただ、いわゆる核のフットボールの運用も「ちゃんと鍵を持ち歩けばいいでしょ」というものなので、これはこれで強固なのかもしれない。あとは基盤がむき出しなので適当なケースに入れたり樹脂に包埋すると映画とかでみる謎の装置が完成する。

実際に使った話

自宅で使っているノートパソコンのキーボードの調子が悪くなって文字入力ができなくなってしまった。色々試しても直らなかったので何も考えず再起動したところ問題が発生。ログイン画面が出てきて頭を抱えた。パスワードを入力しようにも、キーボードは使えないまま。ログインすらできないので、如何ともし難い状態になってしまった。そこで、登場したのが例の物理パスワード。ログイン画面で USB を差し込むとパスワードが入力されて無事にログインすることが出来た。結局外付けキーボードをつけて使っているが、備えあれば憂いなし。

コメント

このブログの人気の投稿

Excelで近似直線の傾きと切片を得る

塩基配列のデータを扱うときは専用エディタ ApE を使おう

Illustrator で稲妻マークを描く