Как использовать хранилище ключей Android для хранения паролей и другой конфиденциальной информации
ДомДом > Блог > Как использовать хранилище ключей Android для хранения паролей и другой конфиденциальной информации

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

Jun 03, 2024

Партнерские ссылки на Android Authority могут приносить нам комиссию. Узнать больше.

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

Как следует из названия, приложение может хранить несколько ключей в хранилище ключей, но приложение может только просматривать и запрашивать свои собственные ключи. В идеале с помощью хранилища ключей приложение должно генерировать/или получать пару частного/открытого ключей, которая будет храниться в хранилище ключей. Затем открытый ключ можно использовать для шифрования секретов приложения перед его сохранением в папках приложения, а закрытый ключ может использоваться для расшифровки той же информации при необходимости.

Хотя поставщик хранилища ключей Android был представлен на уровне API 18 (Android 4.3), само хранилище ключей доступно начиная с API 1 и ограничено для использования системами VPN и Wi-Fi.

Само хранилище ключей зашифровано с использованием собственного PIN-кода/пароля экрана блокировки пользователя, поэтому, когда экран устройства заблокирован, хранилище ключей недоступно. Имейте это в виду, если у вас есть фоновая служба, которой может потребоваться доступ к секретам вашего приложения.

Основным макетом нашего примера приложения является ListView, элементы которого состоят из списка всех ключей (фактически псевдонимов/имен ключей), созданных приложением. Это сохраняется как макет/активность_main.xml.

Каждый элемент в списке содержит TextView, представляющий псевдоним ключа, кнопку для удаления ключа и кнопки для шифрования и расшифровки текста. Этот макет/list_item.xml в нашем проекте.

Заголовок списка добавляется в ListView с помощью метода

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

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

Чтобы сгенерировать пару открытых/закрытых ключей, нам нужен объект KeyPairGenerator. Мы получаем экземпляр KeyPairGenerator, настроенный на использование алгоритма RSA с «AndroidKeyStore». Вызов методаgenerateKeyPair() создает новую пару ключей (закрытый и соответствующий открытый ключ) и добавляет ее в хранилище ключей.

Расшифровка — это, по сути, обратный процесс шифрования. Расшифровка выполняется с использованием закрытого ключа пары ключей. Затем мы инициализируем Cipher с тем же алгоритмом преобразования, который использовался для шифрования, но с установленным значением Cipher.DECRYPT_MODE. Строка Base64 декодируется в byte[], который затем помещается в ByteArrayInputStream. Затем мы используем CipherInputStream для расшифровки данных в байт[]. Затем это отображается как строка.

Хранилище ключей Android упрощает создание ключей приложений и управление ими, а также обеспечивает безопасное и относительно надежное хранилище для приложений, в которых хранятся ключи шифрования. Конечно, открытый ключ также может быть отправлен на ваш сервер, а открытый ключ сервера — в ваши приложения, чтобы обеспечить безопасную связь между вашим приложением и вашим сервером. Как обычно, полный исходный код доступен на GitHub, и вы можете использовать его по своему усмотрению. Для дополнений, исправлений и/или обсуждений оставьте комментарий ниже, мы будем рады услышать ваше мнение.