2013年5月21日火曜日

YubiKey Client COM API

今回は 開発者向け Low-Level library の中から Windows Client COM API / YubiKey Client COM API を叩いてみることにします。名称はウェブやドキュメントで安定していませんね。そのため、Client COM API と呼ぶのが無難でしょうか?



名称に Client が含まれていることから解るように、YubiKey が刺さっている PC 上のクライアントアプリが認証補助するために使うための API みたいです。

Low-Level library
http://www.yubico.com/develop/open-source-software/low-level-library/

前回の COM と同じように、32bit 版をダウンロード~インストールを行い、regsvr32 で YubiClientAPI.dll の登録を実施します。

Excel VBA で Yubico Client API 1.0 Type Library が追加されている事を確認。

Client API では、YubiClient クラスを使えば良いようである。利用言語環境によっては IYubiClient 等になるかも?

試しに VBA で YubiKey のシリアル番号を取り出すようなコードを書いてみることにします。
こんな感じでしょうか?

Option Explicit

Sub getSerialTest()
  Dim y As New YubiClient
  Dim ret As Integer
  Dim result As String
  
  ret = y.readSerial(ycCALL_BLOCKING)
  If (ycRETCODE_OK = ret) Then
    y.dataEncoding = ycENCODING_UINT32
    result = y.dataBuffer
  Else
    result = "Error."
  End If
  
  Debug.Print result
End Sub

実行すると、YubiKey の裏面や Personalization Tool 等で見たシリアル番号が取り出せています。ドキュメントを読むと、readSerial はブロッキングで同期呼び出しを行う以外に、非同期で呼び出すことも可能と書いてありますが、これは後述します。なお、YubiKey を2つ同時に挿して実行すると、ret には ycRETCODE_MORE_THAN_ONE (2) が返っています。定数名から解るように複数刺さっている状態もプログラム側では一応認識できるようになっている。ということです。


こんな感じで叩ける、というのは解ったわけですが、実際にドキュメントからどんな機能があるのか、ざっくり見てみましょう。

3.1 YubiKey クライアント API の特徴
この章で、おおよその機能が簡単にまとめられています。

  • Yubico OTP challenge-response
  • HMAC-SHA1 challenge-response
  • 工場出荷時に書き込まれたデバイスシリアル番号の読み取り
  • デバイスの接続と切断の非同期通知

3.2 非同期 対 同期モデル
この章で、challenge-response 認証を試みる際、ユーザに YubiKey を触れさせて、明示的に認証を行う流れが説明されています。これが非同期モデルみたいですね。

認証を行う流れとして、ユーザ認証の実行が画面上のログインボタンの押下時、あるいは、(YubiKey 接続と同時に)完全に自動で行う形にする場合などは同期モデルということでしょうか?これらの方法はシンプルで実装も比較的ストレートに書けば良いと推測しますが、認証の流れの中で YubiKey に触れさせて、認証を実施する。というより複雑な流れも非同期モデルとして実現できるようです。

非同期って、個人的には生体認証とかで使うべきモデルに感じます。YubiKey だと他人に盗まれた場合に非同期で認証されても、結局悪用はされてしまうので、セキュリティが硬くなる等のメリットはありません。アプリのログイン画面にボタンを一切配置せず、YubiKey を触れてログインする。なんてことはできるかもしれませんが、無理して実装が難しくなる非同期を選択するのは、あまり現実的では無さそうに思います。私の理解が足りていないだけかもしれませんが、明らかな優位性、メリットを知っている方がいらっしゃればご教示頂けると幸いです。


さて、先ほどのコードでは、シリアル番号を読み取った訳ですが、このドキュメントの説明を読む限り、工場出荷時に不変のユニークなシリアル番号が書き込まれているようですので、Slot に設定されている認証を使わずとも、このシリアル番号を認証時のマスターデータとしてユーザID とセットで管理しておけば、YubiKey での単純な認証も実現可能ということが言えます。

次回は、Client COM API で、HMAC-SHA1 Challenge-Response を叩いてみることにしましょう。


余談になりますが、日本国内だと Suica や Pasmo といった首都圏の鉄道・バスで利用できるカードが普及しているわけですが、これらの FeliCa カードも個体識別用のユニークID が割り振られており、厳密な認証を行う場合は、中に電子証明書を入れて判定を行うわけですが、シンプルな認証で十分なシステムであればデバイスのユニークIDとユーザを紐付けるだけで処理することも多いと思います。例えば FeliCa カードを使った安価な勤怠管理システムなど、この手が多いのではないでしょうか?FeliCa のユニークID の取得だけの実現であれば PaSoRi 等の FeliCa 対応のカードリーダーとライブラリを使ってしまえばそれほど難しいわけではありません。

以上、余談でした。

0 件のコメント:

コメントを投稿