Androidの新しい力、指紋認証をアプリで使う!

  • 14
    Like
  • 0
    Comment
More than 1 year has passed since last update.

来た。Android M。

2015年10月に、ついにAndroid Mがリリースされました。Android Mにはいくつかの機能追加が入っていますが、その中で私が注目しているのは指紋認証です。

本投稿を読んでいただくと、Androidアプリへの指紋認証の組み込み方がわかります。
また、指紋認証と暗号を使ったサンプルコードもご用意しました。暗号を使うのは少しくせがあるため、この投稿を覚えておいていただく価値はあると考えます。

Android MでAndroid標準APIになった指紋認証

これまでも指紋認証を端末独自にサポートするAndroidはありましたが、Android MからはAndroid標準APIで指紋認証がサポートされるようになりました。これで端末のロック解除だけでなく、アプリに指紋認証を取り込むことができます。早速使ってみます。

やることは2つ。AndroidManifest.xmlへの権限追加とFingerprintManagerの利用です。

Androidで指紋認証

さて、早速ソースコードを見てみましょう。

AndroidManifest.xml(抜粋)
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>

AndroidManifest.xmlで指紋認証を使うUSE_FINGERPRINTを宣言します。

FingerAuthActivity.java(抜粋)
FingerprintManager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);
if (fingerprintManager.isHardwareDetected() || fingerprintManager.hasEnrolledFingerprints()) {//指紋を取るハードウェアがあり、かつ、指紋が登録されていることをチェック。
    fingerprintManager.authenticate(null, null, 0, new FingerprintManager.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errorCode, CharSequence errString) {
            Log.e("", "error " + errorCode + " " + errString);
        }

        @Override
        public void onAuthenticationFailed() {
            Log.e("", "failed");
        }

        @Override
        public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
            Log.i("", "auth success";
        }
    }, new Handler());
}

Context#getService() にFINGERPRINT_SERVICEを指定することでfingerprintManagerが得られるので、そこにコールバックオブジェクトであるFingerprintManager.AuthenticationCallbackを設定します。
認証が成功・失敗・エラーになるに応じてFingerprintManager.AuthenticationCallbackの各メソッドが1度だけ呼びだされます。

認証する指紋は予め端末に設定されていなければなりません。
上記コードを実行して端末に設定された指紋で指紋センサーに触ると、onAuthenticationSucceededが呼びだされます。
設定されていない指紋で指紋センサーに触るとonAuthenticationFailedが呼びだされます。

FingerprintManager#authenticateの解説

FingerprintManager#authenticateをもう少し詳しく見てみましょう。
第1引数にはCryptoObjectを指定します。これはAndroidの鍵ストアに指紋認証を行わないと利用できない鍵を設定するためのものです。詳しくは後述します。
第2引数には指紋認証をキャンセルするためのオブジェクトを設定します。
第3引数には指紋認証のコールバックオブジェクトを指定します。
第4引数は0じゃなきゃダメだそうです。
第5引数に、第3引数のコールバック時に利用されるハンドラを渡します。スレッドのコンテキストとでも言えばいいでしょうか。UIスレッドのハンドラを渡すことが多いです。

この中で重要なのが第一引数のCriptObjectです。
認証しないと利用できない鍵を設定することができ、この鍵を利用するための暗号機が、指紋認証成功時に得られるAuthenticationResultからgetCryptoObject取得することができます。これで指紋認証と署名用などの鍵情報を紐付けることができます。
この仕組を使うことで、例えば、鍵をサーバと端末で共有し、認証時にサーバからの求めに応じて端末で鍵を使って暗号化処理を行います。サーバは暗号化されたデータが共有された鍵を使ったものと一致するかを確認することで、端末で指紋認証が行われたことを確認することができます。
つまり、サーバへのログインに、パスワードの代わりにAndroidの指紋認証が使えるというわけですね。
暗号鍵を用いた指紋認証のコードはこちらにサンプルを置いておきました。ご覧ください。

Androidの標準APIで指紋認証が使えるようになったことで、ますます指紋認証の利用用途が広まっていくことが期待できます。
Android端末には複数の指紋が登録できるのですが、現段階では、どの指紋で認証されたかは得られないようです。どの指紋で認証されたかがわかるようになり、複数人の指紋を登録しておいて個人特定に使える用になると、更に楽しそうですね。今後に期待です。