web-dev-qa-db-ja.com

サーバーでのCordova指紋認証

私の(cordova)アプリでAndroidの認証メカニズムを作成しようとしています。これにより、ユーザーはパスワードとユーザー名を使用してサインインしたり、サインのために指をスキャンしたりできますに。

クライアント、サーバー側に登録された指紋を確認するにはどうすればよいですか?これはコルドバを使用してもまったく可能ですか?フィンガースキャンの結果をサーバーに送信してみました。

FingerprintAuth.isAvailable(function(result) {
  if (result.isAvailable) {
    if(result.hasEnrolledFingerprints){
      FingerprintAuth.show({
        clientId: client_id,
        clientSecret: client_secret
      }, function (result) {
        alert(JSON.stringify(result));

        $http.post('http://192.168.149.33:3000/authorize', result).then(
          function(response) {}
        );

        if (result.withFingerprint) {
          $scope.$parent.loggedIn = true;
          alert("Successfully authenticated using a fingerprint");
          $location.path( "/home" );
        } else if (result.withPassword) {
          alert("Authenticated with backup password");
        }
      }, function(error) {
        console.log(error); // "Fingerprint authentication not available"
      });
    } else {
      alert("Fingerprint auth available, but no fingerprint registered on the device");
    }
  }
}, function(message) {
  alert("Cannot detect fingerprint device : "+ message);
});

サーバー側で次のデータを受信して​​います(3回の個別スキャン):

{ withFingerprint: 't8haYq36fmBPUEPbVjiWOaBLjMPBeUNP/BTOkoVtZ2ZiX20eBVzZAs3dn6PW/R4E\n' }
{ withFingerprint: 'rA9H+MIoQR3au9pqgLAi/EOCRA9b0Wx1AvzC/taGIUc8cCeDfzfiDZkxNy5U4joB\n' }
{ withFingerprint: 'MMyJm46O8MTxsa9aofKUS9fZW3OZVG7ojD+XspO71LWVy4TZh2FtvPtfjJFnj7Sy\n' }

パターンは毎回変化するようですが、指紋を、たとえばユーザーのデータベースに保存されているパターンにリンクする方法はありますか?

17
Mark Stroeven

短い答え

このAPIによって返される文字列は、「指紋パターン」ではありません。だからあなたはあなたが考えている方法を認証することができません...

長い答え

まず、使用しているように見えるAPIの ソースコード を見てみましょう。

このファイル を見ると、次のメソッドが表示されます。

public static void onAuthenticated(boolean withFingerprint) {
    JSONObject resultJson = new JSONObject();
    String errorMessage = "";
    boolean createdResultJson = false;
    try {

        if (withFingerprint) {
            // If the user has authenticated with fingerprint, verify that using cryptography and
            // then return the encrypted token
            byte[] encrypted = tryEncrypt();
            resultJson.put("withFingerprint", Base64.encodeToString(encrypted, 0 /* flags */));
        } else {
            // Authentication happened with backup password.
            resultJson.put("withPassword", true);

            // if failed to init cipher because of InvalidKeyException, create new key
            if (!initCipher()) {
                createKey();
            }
        }
        createdResultJson = true;

// ...

/**
 * Tries to encrypt some data with the generated key in {@link #createKey} which is
 * only works if the user has just authenticated via fingerprint.
 */
private static byte[] tryEncrypt() throws BadPaddingException, IllegalBlockSizeException {
    return mCipher.doFinal(mClientSecret.getBytes());
}

何が入れられているのかを見てください"withFingerprint"。暗号化されたクライアントシークレットのBase64エンコーディングです。技術的には、これは認証です。このトークンを使用してリクエストを認証し、サーバーはクライアントシークレットを復号化して検証します。

まとめ

フィンガープリントはセキュリティのレベルを追加しますが、セキュリティの唯一の手段ではありません。事前にデバイスとサーバーとの関係を確立する必要があります。

この図は、Androidの指紋認証の目的を理解するのに役立ちます(ref: http://Android-developers.blogspot.com/2015/10/new-in-Android-samples-authenticating.html

enter image description here

10
souldzin

サーバーで指紋を認証できません。指紋はLive Scan/Biometric templateを使用して保存または認証されます。認証は、現在のスキャンテンプレートと以前に保存されたテンプレートを比較することによって行われます

まず、これらの保存されたテンプレート(OSプロバイダー/電話メーカーでは提供されていません)にアクセスできません。これらのテンプレートにアクセスできると想定する場合、効率的なアルゴリズム(画像ベース/パターンベース)が必要です現在のテンプレートを以前に保存したテンプレートと比較します。文字列を比較するだけでは認証できません。

1
Vikas Sardana