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

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

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

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

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

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

Строки, возвращаемые этим 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 )

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

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

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

Для проверки подлинности отпечатков пальцев используйте cordova-plugin-fingerprint-aio.

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