Сохраняйте конфиденциальные данные на Android с EncryptedSharedPreferences и Biometric - PullRequest
1 голос
/ 01 марта 2020

Я хочу хранить конфиденциальную информацию, например, PIN-код для входа. Сегодня с EncryptedSharedPreferences (ESP) можно утверждать, что этого достаточно. Но скажем, я хочу предложить возможность использовать Биометрия . В этом примере Google показано, как использовать BiometricPrompt.CryptoObject для шифрования и дешифрования данных.

Но возникает один вопрос:
Должен ли я сохранить ПИН-код в ESP без добавления еще одного уровня безопасности?

В этом случае приглашение Biometri c будет действовать как более быстрый и удобный способ ввода PIN-кода. Мне просто нужно прослушать onAuthenticationSucceeded, игнорируя result: BiometricPrompt.AuthenticationResult, и предположить, что пользователь вошел в систему (или выполнить вход в API с использованием значения PIN, сохраненного в ESP). Если я сохраню ПИН-код в ESP, но с дополнительным уровнем безопасности, обеспечиваемым шифрованием CryptographyManager (cryptographyManager.encryptData / cryptographyManager.decryptData), у меня возникнут проблемы, когда пользователь вставит ПИН-код вручную, потому что я не имеют возможности зашифровать вставленные данные и сравнить с зашифрованными сохраненными. В этом сценарии у меня не будет объекта Cipher, поскольку в нем нет BiometricPrompt (допустим, я хочу предложить возможность автономного входа в систему).

Может быть, я здесь пропускаю шаг, но достаточно ли хранить ПИН-код в ESP и использовать только «Биометрию» для «удобного входа»?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

я сделал библиотеку, чтобы сделать именно это:

Эта библиотека использует liveata для объединения androidx.security с androidx.biometri c

Вы можете просто использовать это внутри фрагмента или действия

BiometricEncryptedSharedPreferences.create(
        this,
        "secret_shared_prefs",
        1,
        new BiometricPrompt.PromptInfo.Builder().setTitle(getString(R.string.app_name)).setDeviceCredentialAllowed(true).build()
).observe(this, it -> {
    it.edit().putString("secretValue", "IT works!").apply();
    System.out.println(it.getString("secretValue", "It didn't work"));
});
1 голос
/ 04 марта 2020

Ключи, которые шифруют ваши зашифрованные общие настройки, в свою очередь, шифруются с помощью мастер-ключа. MasterKeys.getOrCreate принимает KeyGenParameterSpec в качестве ввода.

Вместо того, чтобы просто использовать предопределенный MasterKeys.AES256_GCM_SPEC, вы можете создать свой собственный KeyGenParameterSpec с нужными настройками, например, указав, что Требуется аутентификация пользователя .

См. Пункты в разделе "Для случаев использования, требующих дополнительной безопасности, выполните следующие шаги" здесь .

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