10/26(月)に Android Developers Blog で、New in Android Sample: Authenticating to remote servers using the Fingerprint API という記事が公開されました。
さらに 10/19(月)にNexus5Xが発送されたにも関わらず全然触ることが出来なかったのですが...
お!ついにNexus5X発送された!! http://t.co/r3B81DMXgK
— パスポート (@androhi) 2015, 10月 19
ついにN5Xの封印が解かれた! pic.twitter.com/MtDcEdbRk6
— パスポート (@androhi) 2015, 10月 27
今日やっとセットアップを終えたということもあり「思ったより指紋認証よさそう」って高まってるので、実際にサンプルコードを見て触ってみました。
指紋認証 API
先程のブログ記事によると、Android 指紋認証 API は安全に利用することが出来るよう、デバイスのセキュアなハードウェアに含まれているとのことです。
指紋認証 API の利用の仕方としては2種類の方法を、アプリケーションのニーズに合う方を選ぶのが望ましいようです。
例えば、オフラインのファイルやデータベースにアクセスするときは、パスワードと同じような Symmetric Keys を使い、ネットワークへのログインやオンライン取引のようなケースでは、公開鍵と秘密鍵で構成される Key Pair による Asymmetric Keys を使う、といった形です。
サンプルコード
Google が公開している指紋認証機能に関するサンプルコードは、AsymmetricFingerprintDialog と FingerPrintDialog の2つあります。
AsymmetricFingerprintDialog の方は、名前の通りペアの鍵を用いてクライアント/サーバー間で認証を行うサンプルです。今回新たに追加されたサンプルは、こちらのようです。
FingerprintDialog の方は、Android 6.0 が public preview のときに公開されたサンプルで、とりあえずどうやって指紋認証をアプリに実装するかを示したものです。
両者のサンプルコードを比較してみると、違うのはサーバー側の処理のフェイクを実装している部分と、鍵の生成に KeyGenerator クラス使ってるか KeyPairGenerator クラスを使ってるかっていうあたりでした。
認証フロー的な説明は、公式ブログが詳しいのでそっちを読めばいいとして、もう少し細かいとこを見てみました。
指紋認証の可否判定
サンプルコードを見てみると、2つのチェックを行っていました。1つは画面ロックに、スワイプ/パターン/PIN/パスワードのいづれかが設定されているかどうか、もう1つは端末に指紋が登録されているかどうかです。
画面ロックの有無をチェックするコード
getSystemService(KeyguardManager.class).isKeyguardSecure();
設定 > セキュリティ > 画面ロック の設定をチェックできる
指紋登録の有無をチェックするコード
getSystemService(FingerprintManager.class).hasEnrolledFingerprints();
設定 > セキュリティ > Nexus Imprint の設定をチェックできる(Nexus5Xの場合)
指紋の読み取り
サンプルアプリを動かしてみると、下図のような指紋センサーにタッチさせるダイアログが出るのですが、このダイアログが表示されてるときに指紋センサーが反応するようです。
どういう風に実装されてるか見てみました。(公式ブログにも載ってますが...)
細かい部分は割愛しますが、以下のコードで実現していました。
指紋の読み取りを開始するコード
getSystemService(FingerprintManager.class).authenticate(cryptoObject, cancellationSignal, 0, this, null);
FingerprintManager#authenticate(FingerprintManager.CryptoObject, CancellationSignal, int, FingerprintManager.AuthenticationCallback, Handler) メソッドで読み取り開始〜コールバック受け取りまで出来るようです。
一応 Support Library にも FingerprintManagerCompat クラスが用意されいて、API level 23 より前のデバイスで指紋機能なしとして振る舞ってくれるらしいです。試してません。
あとは FingerprintManager クラスには、ハードウェアとして指紋機能が有効かチェックする isHardwareDetected()
というメソッドもありました。
まとめ
ざっくり見た感じでは、Asymmetoric Keys のやり方でもサンプルコードのおかげで、割とすぐに実装できそうな気がしました。
アプリのログインが指紋認証で出来るのは、すごく楽だと思うので積極的に取り入れていきたい気持ちになりました。