Intereting Posts
MultiLine EditText в Android с курсором, начинающимся сверху Как запустить эмулятор Android автоматически из Eclipse? Студия Android не загружается полностью Когда вызываются onSaveInstanceState () и onRestoreInstanceState (), точно? Обновление списка при изменении данных адаптера Можно ли использовать VectorDrawable в кнопках и TextViews с помощью Android: DrawableRight? Изменить стиль ProgressDialog Какова цель «полезной нагрузки разработчика»? Для чего он может быть использован? Как установить фиксированное соотношение сторон для макета в Android Программно введите секретный код, например * # * # 4636 # * # * на Android Почему мой текст кнопки принудительно задействован для ВСЕХ CAPS на Lollipop? Android: дата передачи в putExra Когда я загружаю ADT, почему я получаю сообщение об ошибке «Для Android SDK требуется Android Developer Toolkit версии XX.XX или выше?» HTTP GET с телом запроса RETROFIT Android Studio – невозможно создать проект – GradleConnectionException

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

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

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

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

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

Solutions Collecting From Web of "Аутентификация отпечатка пальца Кордовы на сервере"

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

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