How to use the Android Keystore to store passwords and other sensitive information
Preparation
Before we begin coding, it is helpful to understand a bit about the Android Keystore, and it’s capabilities. The Keystore is not used directly for storing application secrets such as password, however, it provides a secure container, which can be used by apps to store their private keys, in a way that’s pretty difficult for malicious (unauthorised) users and apps to retrieve.
As its name suggests, an app can store multiple keys in the Keystore, but an app can only view, and query, its own keys. Ideally, with the keystore, an app would generate/or receive a private/public key pair, which would be stored in the keystore. The public key can then be used to encrypt application secrets, before being stored in the app specific folders, with the private key used to decrypt the same information when needed.
Although the Android Keystore provider was introduced in API level 18 (Android 4.3), the Keystore itself has been available since API 1, restricted to use by VPN and WiFi systems.
The Keystore itself is encrypted using the user’s own lockscreen pin/password, hence, when the device screen is locked the Keystore is unavailable. Keep this in mind if you have a background service that could need to access your application secrets.
Источник
Как я потерял пароль от Android keystore, но потом смог восстановить с помощью Jetbrains Idea
Жило-было в Google Play Android приложение с несколькими тысячами пользователей. Через год понадобилось его обновить. Ок, запускаем Idea, выбираем «Build» — «Generate Signed APK». Вспоминаю что за это время успел пересесть в Linux, ничего страшного, выбираю файл с ключами, ввожу ранее заботливо записанный пароль… Не подходит. Хмм… Ввожу еще раз, еще… Перебор вариантов, переспрос коллег… Всё плохо.
В итоге потенциально три приложения зависли в Google play, ни один из вариантов не подходит. Вспоминаю, что Windows остался на dual-boot, перезагружаюсь туда, к счастью в этом экземпляре Idea остался сохраненный пароль.
Приложение успешно обновлено, но проблема с паролем осталась. Запрос в Jetbrains к сожалению не помог, поддержка ответила быстро, но ответ был в том духе что пароль восстановить не является возможным, дали ссылку на исходники и предложили сделать свой хак. Что в общем то логично.
Ну что же, надо думать. Так как Idea это обычное java-приложение, то возникла мысль подключить свой код к тому месту, где из хранилища считываются пароли. После прочтения топика про javaagent быстро набросал свой java agent который просто записывал в файл имена всех загружаемых классов. Все что нужно чтобы Idea запускалась с java agent, это прописать в файл idea.exe.vmoptions (или idea64.exe.vmoptions) строку вида
После запуска с агентом текстовый файл быстро наполнился строками вида
Затем жму на «Generate Signed APK» и смотрю на вывод в файле:
Кажется, все нужное нам лежит в exportSignedPackage
Небольшое гугление, и находим исходники 2012 г.
Здесь нас привлекает кусочек кода:
Здесь видно, что пароли вытаскивается из защищенного хранилища и сохраняются в JPasswordField (стандартный контрол Swing для ввода паролей).
Осталось всего ничего — вытащить данные из текстовых полей. В этом нам поможет Javassist — библиотека для манипулирования байт-кодом «на лету». Пишем в нашем java-agent следующий кусочек кода:
Что он делает? Перехватываем момент загрузки класса JPasswordField, находим в нем метод getPassword() и добавляем в конец метода наш фрагмент кода, который печатает в консоль искомый пароль ($_ это служебная переменная javassist, где лежит значение возвращаемое методом).
Таким нехитрым способом пароли были восстановлены и спасены.
P. S. А пароль оказался тем же самым, что и был записан, но вводился в русской раскладке. Всё было просто на самом деле…
Источник
Как справиться с потерянным паролем KeyStore в Android?
Я забыл свой пароль от хранилища ключей и не знаю, что делать дальше (не могу или не буду оправдываться). Я хочу обновить свое приложение, потому что я только что исправил ошибку, но это больше невозможно. Что произойдет, если я использую то же хранилище ключей, но создаю новый ключ? Смогу ли я по-прежнему обновлять приложение, и если это невозможно, как я могу предоставить пользователям информацию об обновленной версии?
Если кто-то сталкивался с подобной проблемой или столкнулся с проблемами, какой совет вы можете дать, чтобы помочь исправить ситуацию? К счастью, это бесплатное приложение.
46 ответов
Это прискорбно, но если вы потеряете хранилище ключей или пароль к хранилищу ключей, ваше приложение будет потеряно. Единственное, что вы можете сделать, это повторно отправить свое приложение на рынок под новым ключом.
ВСЕГДА сделайте резервную копию вашего хранилища ключей и запишите пароли в безопасном месте.
Просто столкнулся с этой проблемой сам — к счастью, мне удалось найти пароль во временном файле какого-то Gradle. На всякий случай, если кто-нибудь приземлится здесь, попробуйте найти
Это было там в открытом тексте. В общем, если вы помните хотя бы часть своего пароля, попробуйте найти файл, содержащий эту подстроку, и, надеюсь, вы что-нибудь найдете.
Хотел выкинуть это сюда, может быть, это в конечном итоге кому-нибудь поможет.
Если введен неправильный пароль, хотя бы один раз, он повторяет следующие попытки:
Подделка хранилища ключей или неверный пароль.
Даже когда вы предоставляете правильный. Я пробовал это несколько раз, может быть, это какая-то защита.
Закройте мастер экспорта и запустите его снова с правильным паролем, теперь он работает:)
Грубая твоя лучшая ставка!
Вот сценарий, который помог мне:
При желании вы можете дать ему список слов, которые пароль может включать в себя для очень быстрого восстановления (для меня это сработало 42
Наконец я нашел решение, проведя два дня.
Следуй этим шагам:
- Перейти к проекту
- В.gradle найдите папку с версиями Gradle, в моем случае это было 4.1 (см. Рис.)
- разверните папку 4.1, а затем в папке taskHistory вы найдете файл taskHistory.bin.
- Откройте файл taskHistory.bin в самой студии android.
- Ищите «.storePassword» .. Вот и все, вы получили пароль хранилища ключей.
Это действительно сработало для меня.
Попробуйте это и счастливое кодирование.
РЕШЕНИЕ 2019 (Windows, Android Studio 3.3, Gradle 4.10):
Это решение работает, только если флажок «Запомнить пароль» был ранее отмечен.
Прежде всего, для этой версии gradle не существует файл taskArtifacts.bin, а файл idea.log показывает звездочки для паролей. Это были старые решения, которые мне не помогли.
Где я нашел пароли в виде открытого текста: C:\Users\
Ключи: mStorePassword и mKeyPassword.
Я действительно надеюсь, что это поможет кому-то еще.
При запуске утилиты консоли MAC и прокрутки вниз до
/Library/Logs -> AndroidStudio ->idea.log.1 (или любого старого номера журнала) Затем я искал «хранилище ключей», и оно должно появиться где-то в журналах.
На самом деле, проигрыш keystore password не проблема.
Вы можете создать новое хранилище ключей и установить для него новый пароль с помощью команды keytool ниже. Вам не нужен оригинальный пароль хранилища ключей:
keytool -importkeystore -srckeystore path/to/keystore/with/forgotten/pw \
-destkeystore path/to/my/new.keystore
При появлении запроса создайте пароль для своего new.keystore и для пароля хранилища ключей источника (который вы потеряли) просто нажмите Enter.
Вы получите предупреждение о том, что целостность не проверена, и вы получите новый.keystore, идентичный оригинальному с новым паролем.
Причина, по которой это работает keystore password используется только для обеспечения целостности keystore он не шифрует данные, в отличие от private key password , который на самом деле держит ваш закрытый ключ в зашифрованном виде.
Обратите внимание, что вы должны знать свой private key password подписать ваши приложения. Хорошо, если это так же, как забыли keystore password тогда вы можете прибегнуть к грубой силе, как в ответе @ Артура.
Этот подход всегда работал для меня.
Я чувствую, что должен дать ответ, потому что это не может быть просто в комментариях. Как @ElDoRado1239 говорит в своем ответе (не забудьте высказать его ответ;)
- Ищет ..Project\.gradle\2.4\taskArtifacts\taskArtifacts.bin в моем случае был в ..Project\.gradle\2.2.1\taskArtifacts\taskArtifacts.bin потому что я использую gradle 2.2.1
- Тогда ищи storePassword как @Moxet Хан говорит в комментариях. в моем случае был на линии signingConfig.storePassword¬í t my.forgoten.password—signingConfig.keyAlias
Надеюсь помочь кому-нибудь еще.
К счастью, я нашел свой потерянный пароль вместе с путем к хранилищу ключей и псевдонимом из журналов моей студии Android.
если вы работаете на машинах на основе Linux / Unix.
Перейдите в каталог журналов библиотеки
там, если вы помните свою версию AndroidStudio, которую вы использовали для создания последней версии APK. Перейдите в этот каталог
например: cd AndroidStudio1.5/
Там вы найдете файлы журналов. в любом из файлов журнала (idea.log) вы найдете свои учетные данные хранилища ключей
Надеюсь, это поможет пользователям AndroidStudio
Это может быть немного поздно, но это поможет кому-то наверняка. Вы можете найти пароль, если вы помните что-то иначе, попробуйте поискать
signingConfig.storePassword
Также, если вы забыли псевдоним ключа, вы можете найти здесь что-то вроде signatureConfig.keyAlias
Надеюсь, это поможет кому-то
Потратив почти день на изучение возможных вариантов восстановления утерянного пароля хранилища ключей в Android Studio. Я нашел следующие 4 возможных способа сделать это:
Используйте AndroidKeystoreBrute для восстановления вашего пароля. Этот метод весьма полезен, когда вы частично забыли свой пароль, что означает, что у вас все еще есть некоторые подсказки к вашему паролю.
Вы также можете получить его через файлы журналов Android Studio, если ранее вы выпустили приложение (для которого вы нашли пароль хранилища ключей) на том же компьютере. Обратитесь к следующему каталогу:
Mac OS X
/ Library / Logs / AndroidStudio / idea.log.1
Linux (возможное местоположение)
/ Главная /user_name/AndroidStudio/ системы / журнал
Окна (возможное расположение)
C:\ Users \ имя_пользователя \AndroidStudio\ система \ журнал
и искать Pandroid.injected.signing.key.password внутри файла. Вы увидите пароль, если ранее подписали приложение с той же версией Android Studio, в которой вы сейчас находитесь.
Вы также можете восстановить пароль через каталог.gradle вашего проекта. Ищите следующий путь
Примечание: это не работает для более новых версий Gradle (2.10 и выше).
Если ни одно из вышеуказанных решений не работает, вы можете попробовать это, но для этого также у вас должно быть приложение Android Studio IDE или в настройках, в которых пароль хранилища ключей вашего проекта был сохранен ранее (с помощью параметра «Запомнить пароль» во время подписания приложение). Вы можете получить настройки IDE по следующему пути:
Mac OS X
/ Library / Logs / AndroidStudio / idea.log.1
Linux (возможное местоположение)
/ Главная / user_name / AndroidStudio
Окна (возможное расположение)
C:\ пользователь \ имя пользователя \.AndroidStudio
Просто используйте более старую IDE Android Studio, если у вас есть или импортировали настройки старой IDE в новую IDE, а также поместите файл хранилища ключей в тот же путь, в котором он был ранее, когда вы его подписывали, и сохраните пароль в прошлый раз.
Таким образом, как только вы откроете проект и попробуете Build->Generate Signed APK и выберите файл хранилища ключей из более ранней версии. Он автоматически восстановит пароль и продолжит генерировать подписанный APK для выпуска.
После успешного создания релиза APK вы можете воспользоваться опцией 2, упомянутой ранее, чтобы проверить свой пароль в файле журнала для недавно созданного релиза APK.
Для всех, кто может столкнуться с этим, я хотел бы поделиться ответом, который может иметь место для вас или для других, просматривающих эту статью (как я).
Я использую Eclipse и создал хранилище ключей в нем для моей версии 1.0. Перемотка вперед на 3 месяца, и я хотел обновить ее до 1.1. Когда я выбрал Экспорт. в Eclipse и выбрал хранилище ключей, ни один из моих паролей, которые я мог вспомнить, не работал. Каждый раз, когда он говорил: «Подделка хранилища ключей или неверный пароль». Дошло до того, что я собирался запустить программу грубой силы так долго, как я мог стоять (неделю или около того), чтобы попытаться заставить ее работать.
К счастью, я подписал свой неподписанный файл.apk за пределами Eclipse. Вуаля — это сработало! Мой пароль был верным все время! Я не уверен, почему, но при подписании его в Eclipse через меню «Экспорт» сообщалось об ошибке, даже если мой пароль был правильным.
Итак, если вы получаете эту ошибку, вот мои шаги (взятые из документации Android), чтобы помочь вам подготовить ваш apk к рынку.
ПРИМЕЧАНИЕ. Чтобы получить неподписанный файл apk из Eclipse: щелкните правой кнопкой мыши проект> Инструменты Android> Экспорт неподписанного приложения.
Подпишите неподписанный файл apk с хранилищем ключей
а. откройте командную строку администратора и перейдите в «c:\Program Files\Java\jdk1.6.0_25\bin» или любую другую версию java (где вы скопировали неподписанный apk-файл и хранилище ключей)
б. В командной строке cmd с файлом хранилища ключей и неподписанным apk в том же каталоге введите следующую команду: jarsigner -keystore mykeystorename.keystore -verbose unsigned.apk myaliasnamefromkeystore
с. он скажет: «Введите кодовую фразу для хранилища ключей:». Введите его и нажмите Return.
д. ===> Успех выглядит так:
е. версия без знака перезаписывается на месте, поэтому ваш подписанный файл apk теперь имеет то же имя, что и неподписанный файл
Используйте ZipAlign для сжатия подписанного apk-файла для распространения на рынке
а. откройте командную строку администратора и перейдите в «c:\AndroidSDK\tools» или куда бы вы ни установили Android SDK
Источник