Возможно ли получить UID / хэш от Android Fingerprint API?

431
25 июля 2017, 17:30

Здравствуйте.

Можно ли в Java получить уникальный идентификатор, или хэш (короче грубо говоря последовательность байтов) от пальца при работе с Android Fingerprint API?

Answer 1

Fingerprint Api в Android не отдаёт никаких данных о снятом отпечатке. Вся работа с ним происходит исключительно внутри SDK.

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

Таким образом, даже если преобразовать исходный отпечаток в некий УИД, он будет бесполезен, потому что практически никогда не будет совпадать с полученным УИД при повторном сканировании.

Answer 2

Не совсем согласен с предыдущим ответом, так как можно сказать, что у отпечатка пальцев в системе есть ID. Например, если вывести содержимое файла /data/system/users/0/settings_fingerprint.xml, то можно увидеть следующее:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<fingerprints>
  <fingerprint fingerId="1" name="Lex 1" groupId="0" deviceId="0" />
  <fingerprint fingerId="2" name="Lex 2" groupId="0" deviceId="0" />
  <fingerprint fingerId="3" name="Lex 3" groupId="0" deviceId="0" />
  <fingerprint fingerId="4" name="Lex 4" groupId="0" deviceId="0" />
</fingerprints>

А если взглянуть на исходники fingerprintd, то можно увидеть в методе void FingerprintDaemonProxy::hal_notify_callback(const fingerprint_msg_t *msg) такой фрагмент кода.

case FINGERPRINT_AUTHENTICATED:
            ALOGD("onAuthenticated(fid=%d, gid=%d)",
                    msg->data.authenticated.finger.fid,
                    msg->data.authenticated.finger.gid);
            if (msg->data.authenticated.finger.fid != 0) {
                const uint8_t* hat = reinterpret_cast<const uint8_t *>(&msg->data.authenticated.hat);
                instance->notifyKeystore(hat, sizeof(msg->data.authenticated.hat));
            }
            callback->onAuthenticated(device,
                    msg->data.authenticated.finger.fid,
                    msg->data.authenticated.finger.gid);
            break;
UPD#1

Для желающих более подробно разобраться с механизмом работы fingerprint в Android рекомендую прочитать эту работу.

READ ALSO
Реализация открытия стартового Activity

Реализация открытия стартового Activity

Есть логин activity - а, после логгирования юзер попадает в Activity -b, при сворачивании приложения и открытии ,снова открыватеся activity -a, но каждый...

295
Открыть SharedPreferences вне пакета

Открыть SharedPreferences вне пакета

Методы которые предлагает Context открывают sharedPreferences только из папки пакета приложения, а что, если мне нужно открыть такой файл из внешнего...

200
Подсчет индексов

Подсчет индексов

Есть таблица со столбцом boolean, нужно подсчитать кол-во выбранных строк, когда boolean = true, и это кол-во занести в переменнуюНашел индексы строк...

339