Использование хранилища ключей Android для хранения учетных данных аутентификации пользователя

#android #authentication #keystore #fingerprint #android-keystore

#Android #аутентификация #хранилище ключей #отпечаток пальца #android-хранилище ключей

Вопрос:

Я экспериментирую с методами аутентификации пользователей (точнее, с отпечатками пальцев), а также изучаю Android KeyStore . Я пытаюсь создать систему, которая позволяет пользователю настраивать отпечаток пальца, который будет регистрировать пользователя на моем сервере. В настоящее время серверу требуется запрос POST, для которого требуется действительная комбинация имени пользователя и пароля.

У меня есть несколько вопросов о том, как это будет работать, потому что я только начинающий понимать, как Fingerprint работает API и KeyStore работает.

1) Когда я запрашиваю отпечаток пальца и получаю успешный ответ (что достаточно легко выполнить) — как я могу перевести это в действительное имя пользователя / пароль, чтобы я мог запустить свой запрос POST? Нужно ли мне сохранять имя пользователя и пароль в KeyStore ?

2) Как именно это будет выглядеть при настройке KeyStore ? Нужно ли мне устанавливать псевдоним как для имени пользователя, так и для пароля? Например, «myapp_user», «myapp_pass»?

3) Как я могу сохранить значения для имени пользователя и пароля в KeyStore ?

4) Правильно ли я вообще подхожу к этой проблеме? Есть ли лучший способ надежно связать отпечаток пальца с комбинацией имени пользователя и пароля?

Спасибо за любую помощь!

Комментарии:

1. Хранилище ключей AndroidKeyStore сильно изменилось между 4.4 и текущими версиями (вначале можно было хранить только ключи RSA). Поэтому вы всегда должны учитывать, на какой минимальный SDK вы ориентируетесь.

2. Достаточно справедливо @Robert . Мой вопрос касался таргетинга на API 23, но мне также было бы интересно узнать, как справиться с этим на <23 для большего охвата пользователей.

Ответ №1:

Общий процесс использования хранилища ключей AndroidKeyStore заключается в том, что вы генерируете ключ в хранилище ключей AndroidKeyStore. Этот ключ никогда не покинет хранилище ключей (не может быть экспортирован), но вы можете использовать его, если используете определенные алгоритмы (поддерживаются не все). Здесь вы можете увидеть, какая версия Android поддерживает какой тип шифрования.

В Android API 23 вы можете напрямую сгенерировать ключ AES (в der AndroidKeyStore) и использовать этот ключ AES для шифрования ваших данных использования, таких как учетные данные пользователя, которые вы упомянули.

Перед API23 требуются дополнительные шаги: сначала сгенерируйте ключ RSA в AndroidKeyStore, затем сгенерируйте случайный ключ AES вне хранилища AndroidKeyStore (поскольку AES внутри не поддерживается). Затем зашифруйте сгенерированный ключ AES ключом RSA, который вы сгенерировали в хранилище ключей AndroidKeyStore, и сохраните зашифрованный ключ AES в каталоге данных частного приложения.

После этого вы можете, как в варианте 1, зашифровать учетные данные пользователя с помощью сгенерированного ключа AES.

Комментарии:

1. Я думаю, моя проблема больше связана с пониманием процесса. Я легко могу создать новый псевдоним и сгенерировать пару открытых / закрытых ключей. Но где мне хранить имя пользователя и пароль? Должен ли я шифровать значения и помещать их в SharedPreferences или что-то в этом роде? Какова стандартная практика? Я думал, что на самом деле я помещаю имя пользователя и пароль в хранилище ключей и требую ключ для их возврата. Возможно, у меня неправильное представление о том, что должно делать хранилище ключей.

2.Для справки я проверил следующие примеры в своих поисках. androidauthority.com/…sitepoint.com /…Первый пример просто шифрует / расшифровывает текст, но нигде его не сохраняет. Во втором примере зашифрованный текст сохраняется в SharedPreferences.

3. @h_k: Хранилище ключей предназначено для хранения криптографических ключей. Вы не можете сохранять в нем произвольные данные. Если вы хотите защитить данные, зашифруйте их, как я описал, и сохраните где-нибудь (например, в настройках). Не сохраняйте использованный ключ AES (API23 ), соответственно сохраните его в зашифрованном виде RSA для Android до API23.

4. Связанный пример неплох, но у него есть один существенный недостаток: если защищаемые данные становятся длиннее (> 200 байт), шифрование RSA завершится ошибкой! Поэтому промежуточный шаг с AES. Ключ AES всегда достаточно мал…

5. Спасибо, я приму ваш ответ, поскольку он прояснил для меня некоторые вещи. Я думаю, у меня есть хорошая идея о том, что мне нужно сделать отсюда.

Ответ №2:

У меня такие же требования.Ниже приведены шаги.

  1. При регистрации для опции отпечатков пальцев пользователь будет вводить пароль имени пользователя, а затем отпечаток пальца.
  2. Нам нужно сгенерировать ключ в Android Store и передать его на сервер (имя пользователя, пароль и сгенерированный ключ).
  3. На сервере они сохранят этот ключ, соответствующий имени пользователя и паролю.
  4. Всякий раз, когда пользователь пытается войти в систему с помощью finger pint, со стороны клиента нам нужно взять ключ после успешной аутентификации по отпечатку пальца и передать его на сервер.
  5. На сервере они проверят строку таблицы (server DB), в которой этот ключ уже сохранен, и будут использовать соответствующие имя пользователя и пароль.

Я сомневаюсь, что этот ключ останется прежним. Мы передаем ключ на сторону сервера при регистрации по отпечатку пальца t вместе с паролем пользователя. Так что, если снова, когда пользователь попытается войти в систему и создаст ключ, он останется прежним.