Аутентификация отпечатков пальцев Кордовы на сервере

Я пытаюсь создать механизм аутентификации в моем (кордове) приложении для андроида, который позволит моим пользователям войти в систему, используя пароль и имя пользователя, или позволить им сканировать свой палец для входа.

Как можно проверить отпечаток пальца, зарегистрированный на клиенте, на стороне сервера? возможно ли это вообще с помощью Кордовы? Я попытался передать результат сканирования пальцем на свой сервер: это выглядело так:

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' }

Кажется, что шаблоны меняются каждый раз, есть ли способ связывать отпечаток пальца, например, шаблон, сохраненный под пользователем в базе данных?

Ответы

Ответ 1

Короткий ответ

Строки, возвращаемые этим 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 зашифрованного секретного клиента. Технически это ваша аутентификация. Вы должны использовать этот токен для аутентификации запросов, и ваш сервер расшифровывает и проверяет секрет клиента.

Резюме

Отпечаток пальца добавляет уровень безопасности, но это не единственный способ обеспечения безопасности. Необходимо заранее установить связь с устройством и сервером.

Я нашел эту диаграмму полезной для понимания намерения аутентификации по отпечаткам андроида (ref: http://android-developers.blogspot.com/2015/10/new-in-android-samples-authenticating.html)

введите описание изображения здесь

Ответ 2

Вы не можете аутентифицировать отпечаток на сервере, отпечатки пальцев хранятся или аутентифицируются с помощью Live Scan/Biometric template. Аутентификация выполняется путем сравнения текущего шаблона сканирования с ранее сохраненными шаблонами

Прежде всего у вас нет доступа к этим хранимым шаблонам (не предоставляется поставщиками ОС/изготовителями телефонов), и если мы предположим, что у вас есть доступ к этим шаблонам, то эффективный алгоритм (основанный на образовании/шаблон) требуется сравнить текущий шаблон с ранее сохраненными шаблонами. Вы не можете просто аутентифицировать его путем сравнения строк.

Ответ 3

Использовать кордовую плагин-фингерпринт-айо для проверки подлинности отпечатков пальцев.

Для получения дополнительной информации вы можете обратиться к https://www.npmjs.com/package/cordova-plugin-fingerprint-aio.