Release keys android что это

Ключи, учетные данные и хранилище на Android

Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)

В предыдущем материале о безопасности пользовательских данных Android мы рассмотрели шифрование данных с помощью предоставленного пользователем кода. В этом уроке перейдём к хранению учётных данных и ключей. Я начну с ознакомления с учётными данными и закончу примером защиты данных с помощью хранилища ключей KeyStore.

Часто, при работе со сторонней службой, требуется какая-то форма авторизации. Она может быть настолько простой, как /login на стороне пользователя, которая принимает имя пользователя и пароль.

Сначала может показаться, что простое решение — это собрать UI, который будет предлагать пользователю войти в систему, а затем записать и сохранить их данные для входа. Однако, это не лучший метод, так как нашему приложению не нужно знать данные для входа в сторонний аккаунт. Вместо этого, мы можем использовать Диспетчер учётных записей (Account Manager), который уполномочен отрабатывать эту конфиденциальную информацию для нас.

Диспетчер учётных записей

Диспетчер учётных записей (Account Manager) — это централизованный помощник для работы с учётными данными пользователя, поэтому вашему приложению, иметь дело с паролями напрямую не нужно. Часто он предоставляет токен вместо реального имени пользователя и пароля, который можно использовать для выполнения аутентифицированных запросов к службе. Например, при запросе токена OAuth2.

Иногда, вся необходимая информация уже хранится на устройстве, а иногда Account Manager придётся обращаться к серверу за новым токеном. Вы, наверное, видели раздел Учётные записи в Настройках вашего устройства для разных приложений. И вот как, мы можем получить список доступных учётных записей:

Этому коду потребуется разрешение android.permission.GET_ACCOUNTS . Если вы ищете определённую учётную запись, вы можете найти её вот так:

Как только найдёте учётную запись, её токен можно получить вызвав метод getAuthToken(Account, String, Bundle, Activity, AccountManagerCallback, Handler) . Затем, таки можно использовать как для авторизированных запросов API к сервису. Это может быть RESTful API, в котором вы передаёте параметр токена во время HTTPS-запроса без необходимости знать детали личной учётной записи пользователя.

Так как, у каждой службы будет свой способ проверки подлинности и хранения личных учётных данных, Диспетчер учётных записей предоставляет модули проверки подлинности для реализации сторонней службой. Хотя Android может выполнять вход на многие популярные сервисы, для вашего приложения, вы можете написать свой собственный обработчик авторизации учётной записи и хранилища учётных данных. Это позволит убедиться, что учётные данные зашифрованы. Имейте также в виду, что учётные данные в Диспетчере учётных записей, которые используются другими службами, могут храниться в виде открытого текста, что делает их видимыми для любого, кто имеет рут-права на своё устройство.

Временами вам нужно будет иметь дело с ключами или сертификатами для отдельного лица или сущности, вместо просто данных для входа. Например, когда стороннее приложение отправляет вам файл сертификата, который вам нужно сохранить. Самый распространённый сценарий — это когда приложению нужно авторизироваться на сервере частной организации.

В следующем уроке, мы рассмотрим использование сертификатов для аутентификации и безопасной связи, ну а пока, я всё же хочу рассмотреть, как хранить эти элементы. Изначально Keychain API был создан для очень конкретного использования — установка закрытого ключа или пары сертификатов из файла PKCS#12.

Читайте также:  После сброса настроек обновление андроид

Keychain — связка ключей

Представленный в Android 4.0 (API Level 14), Keychain API управлял ключами. В частности, это работает с объектами PrivateKey и X509Certificate и обеспечивает более безопасный контейнер, чем использование хранилища данных вашего приложения. Связано это с тем, что разрешения закрытых ключей открывают доступ к ключам только вашему приложению и только после авторизации пользователя. Это означает, что, прежде чем, вы сможете использовать хранилище учётных данных, на устройстве должен быть настроен экран блокировки. Кроме того, объекты в связке ключей можно объединить с защитой от оборудования, если доступно.

Код установки сертификата выглядит следующим образом:

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

Как только выбор сделан, возвращается строка с названием псевдонима alias(final String alias) , где вы можете напрямую получить доступ к закрытому ключу или цепочке сертификатов.

Вооружившись этими знаниями, теперь давайте посмотрим, как мы можем использовать хранилище учётных данных для сохранения конфиденциальных данных.

KeyStore

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

Вот где можно использовать KeyStore API. Начиная с API 1, KeyStore используется системой для хранения учётных данных WiFi и VPN. Начиная с 4.3 (API 18), вы можете работать с асимметричными ключами конкретного приложения, а в Android M (API 23) можно хранить симметричный ключ AES. Таким образом, хотя API не позволяет хранить конфиденциальные строки напрямую, эти ключи можно сохранить, а затем использовать для шифрования строк.

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

Генерирование нового случайного ключа

В этом примере вместо генерации ключа AES из предоставленного пользователем пароля мы можем автоматически сгенерировать случайный ключ, который будет защищён в хранилище ключей KeyStore. Мы можем сделать это, создав экземпляр KeyGenerator , настроенного на поставщика «AndroidKeyStore» .

Здесь важно обратить внимание на спецификации .setUserAuthenticationRequired(true) и .setUserAuthenticationValidityDurationSeconds(120) . Для этого, обязательно должна быть включена блокировка экрана и ключ должен быть заблокирован, до тех пор, пока пользователь не аутентифицируется.

Изучив документацию .setUserAuthenticationValidityDurationSeconds() , вы увидите, что это означает, что ключ доступен только через определённое количество секунд после аутентификации по паролю, и что для передачи -1 требуется идентификация по отпечатку пальца каждый раз, когда вы хотите получить доступ к ключу. Включение требования для аутентификации также приводит к отзыву ключа, когда пользователь удаляет или изменяет экран блокировки.

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

Опция .setRandomizedEncryptionRequired(true) включает требование о наличии достаточного количества случайных чисел (каждый раз новый случайный ВИ [вектор инициализации]), чтобы при повторном шифровании одних и тех же данных, зашифрованный результат всё равно не повторялся. Это не позволяет злоумышленнику получить информацию о зашифрованном тексте на основе передачи тех же данных.

Ещё стоит отметить — setUserAuthenticationValidWhileOnBody(boolean remainsValid) , что блокирует ключ, как только устройство обнаружит, что он больше не принадлежит человеку.

Шифрование данных

Теперь, когда ключ хранится в хранилище KeyStore, мы можем создать метод, который зашифрует данные с использованием объекта Cipher , учитывая SecretKey . Это вернёт HashMap , содержащий зашифрованные данные и случайный ВИ, который понадобится для расшифровки данных. Зашифрованные данные вместе с ВИ могут быть сохранены в файл или в открытых настройках.

Читайте также:  Эмуляция android под linux

Расшифровка в массив байтов

Для расшифровки применяется обратный ход. Объект Cipher инициализируется с использованием константы DECRYPT_MODE , и возвращается расшифрованный массив byte[] .

Смотрим на примере

Теперь мы можем посмотреть на пример!

Использование асимметричных ключей RSA для старых устройств

Это хорошее решение для хранения данных в версии M и выше, но что, если ваше приложение поддерживает более ранние версии? Хотя симметричные ключи AES не поддерживаются в M, поддерживаются асимметричные ключи RSA. Это означает, что для достижения того же результата, мы можем использовать RSA ключи и шифрование.

Основное отличие заключается в том, что асимметричная пара ключей содержит два ключа: закрытый и открытый ключ, где открытый ключ шифрует данные, а закрытый ключ расшифровывает их. KeyPairGeneratorSpec передаётся в KeyPairGenerator , который инициализируется с помощью KEY_ALGORITHM_RSA и поставщика AndroidKeyStore .

Для шифрования, из пары ключей мы получаем RSAPublicKey и используем его с объектом Cipher .

Расшифровка выполняется с использованием объекта RSAPrivateKey .

Кое-что об RSA — шифрование медленнее, чем в AES. Для небольших объёмов информации, например, когда вы защищаете строки общих настроек, это не страшно. Если вы обнаружите проблему с производительностью при шифровании больших объёмов данных, то вместо этого вы можете использовать данный пример для шифрования и хранения только ключа AES. И тогда, для остальной части ваших данных, используйте более быстрое шифрование AES, которое обсуждалось в предыдущем уроке. Вы можете сгенерировать новый AES ключ и преобразовать его в массив byte[] , который совместим с этим примером.

Чтобы получить ключ, сделайте вот так:

Довольно много кода! Для простоты примеров, я пропустил обработку исключений. Но помните, что для итогового кода не рекомендуется просто перехватывать все случаи Throwable в одном операторе catch.

Заключение

На этом урок по работе с учётными данными и ключами завершён. Большая часть неразберихи вокруг ключей и хранилища связана с эволюцией ОС Android, но вы можете выбрать, какое решение использовать, учитывая уровень API, поддерживаемый вашим приложением.

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

Источник

Способы генерации ключей подписи и хранилища ключей

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

Если вы решите управлять и защищать свой собственный ключ подписи приложения и хранилище ключей, вы подпишете свои APK с помощью своего ключа подписи приложения. Если вы решите использовать Google Play App Signing для управления и защиты своего ключа подписи и хранилища ключей, вы подпишете APK с помощью своего ключа загрузки.

Создание ключа и хранилища ключей при помощи встроенного мастера IDE Android Studio

Вы можете сгенерировать новый или загрузить существующий в встроенном мастере работы с ключами подписи Android Studio, используя следующие шаги:

  1. В панели меню нажать на Build >Generate Signed APK;
  2. Выбрать модуль из выпадающего меню и нажать Next;
  3. Нажать на Create new для создания нового ключа и хранилища ключей;
  4. В окне New Key Store предоставить информации о распространителе в лице вас, как разработчика

Keystore(Хранилище ключей)

  • Key store path: Выберите местонахождение, где было создано хранилище ключей;
  • Password: Создайте и подтвердите пароль безопасности для хранилища ваших ключей.

Key(ключ)

  • Alias: Введите идентификационное название для вашего ключа;
  • Password: Создайте и подтвердите пароль безопасности для вашего ключа. Этот пароль должен отличаться от пароля хранилища ключей в целях безопасности;
  • Validity (years): Установите длину времени в годах, в течении которого данный ключ будет валиден. Ваш ключ может иметь валидность до 25 лет. В течении этого времени у вас есть возможность выпускать обновления и подписывать приложение данным ключом и это служит жизненным циклом приложения.
  • Certificate: Введите некоторую информацию для вашего сертификата. данная информация не показывается в вашем приложении, но включается в ваш сертификат, как часть файла APK.
Читайте также:  Smart wifi pro android

Создание ключа и хранилища ключей при помощи консольных утилиты keytool в составе Java SDK

Для данного метода генерации ключа нам понадобится утилита keytool. Ее можно найти по адресу C:\Program Files\Java\jdk1.x.x_xxx\bin. Утилита может создавать новые ключи и показывать информацию о уже существующих ключах в файле хранилища ключей.

К примеру выясним, какие ключи есть в хранилище debug.keystore, который расположен по пути C:\Users\WebSofter\.android, используем команду list. С помощью параметров keystore и storepass укажем имя файла хранилища и пароль к хранилищу

Замечание. Если команда keytool вызывает ошибку, что такая команда не найдена, то это значит, что путь к данной программе не добавлен в переменные среды Windows и это следует исправить.

Команда нам показывает, что в данном хранилище хранится один ключ с алиасом androiddebugkey, и создан он был 11.11.2016. Этот ключ и используется Android SDK для подписи нашего приложения, когда формируется debug — APK. Хранилище и ключ имеют одинаковый пароль — android.

Теперь создадим свой собственный ключ, которым мы могли бы подписать release — APK, т.е. unaligned — APK или иначе говоря, неподписанный релиз APK.

Для создания используется подкоманда genkey и к ней идут свои параметры

Параметры в данной команде имеют следующие предназначения:

  • keystore — имя файла хранилища
  • storepass — пароль к хранилищу
  • alias — алиас создаваемого ключа
  • keypass — пароль к ключу
  • dname — информация о владельце ключа
  • validity — срок действия ключа (в днях)

Значение dname задается в определенном формате. В данном случае указаны только имя, организация и страна.

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

Если сейчас посмотреть в это хранилище, введя пароль, который мы выше указали, то мы увидим тот ключ, который мы выше добавляли

Если, после создания файла хранилища с первым ключом мы хотим создать и последующие, то команду добавления можно записать в виде

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

Команду list можно еще выполнить с параметром v. Этот параметр добавляет информативности

Как можно заметить, выводится полная информация о владельце сертификата, дата создания, дата истечения срока и т.д.

Параметр v также можно использовать и с командой genkey. После создания ключа будет выведено немного информации о нем в консоль.

Другие методы создания и подписи

Пожалуй, сюда можно добавить такие инструменты, как:

  • apk-signer — простой инструмент командной строки для подписи apk
  • APK Signing Tool — этот инструмент с оконным интерфейсом позволяет вам подписать APK с вашим хранилищем ключей. Вы можете переопределить хранилище демо-версий и использовать свое собственное хранилище ключей перед загрузкой приложения в Google Play.
  • APK Signer — инструмент с оконным интерфейсом упрощает создание файла хранилища ключей.

Что дальше? Дальше — подписать APK

Продолжайте вручную подписывать APK по статье «Ручная подписка APK», если вы хотите сгенерировать APK, подписанный вашим новым ключом, нажав «Ok», или нажмите «Cancel», если вы хотите только генерировать ключ и хранилище ключей и не подписывать APK.

Если вы хотите использовать подписку на Google Play по статье «Подписка APK на Google Play», перейдите к разделу «Управление ключами подписи приложения» и следуйте инструкциям по настройке подписки на Google Play.

Источник

Оцените статью