Как я потерял пароль от 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?
Я забыл свой пароль хранилища ключей и больше не знаю, что делать (я не могу или не хочу давать никаких оправданий этому). Я хочу обновить свое приложение, потому что я только что исправил ошибку, но это больше невозможно. Что произойдет, если я использую то же хранилище ключей, но создам новый ключ? Смогу ли я по-прежнему обновлять приложение, и если это невозможно, то как я могу предоставить пользователям информацию об обновленной версии?
Если кто-то столкнулся с подобной проблемой или столкнулся с неприятностями, какой совет вы можете дать, чтобы помочь исправить ситуацию? К счастью, это бесплатное приложение.
25 ответов
В следующем коде выбрасываются два исключения [FatalException и MyException]. Тривиальное Myexception (перезаписывает?) Делает FatalException потерянным. как? как справиться с этой ситуацией? try < try < throw new FatalException(Important); >finally < throw new MyException(trivial); >>catch.
Я получаю от веб-сервиса(сделанного мной самим) RSA PrivateKey PKCS#8, закодированного в строке base 64. Мое приложение Android должно надежно сохранить этот ключ где-то в телефоне. Начиная с версии 4.3 Android, возможно сохранение Ключей с помощью нового KeyStore API. Я нашел статью с кодом.
Только что сам столкнулся с этой проблемой — к счастью, мне удалось найти пароль во временном файле Gradle. На случай, если кто-нибудь здесь приземлится:
попробуйте найти этот файл
Это было там в открытом тексте. В общем, если вы помните хотя бы часть своего пароля, попробуйте найти файл, содержащий эту подстроку, и, надеюсь, вы что-нибудь выловите.
Хотел выбросить его сюда, может быть, это в конце концов кому-нибудь поможет.
Правка: Добавлено новое понимание из комментариев, просто чтобы быть более заметным. Правка 2: Добавлено еще несколько мест, о которых сообщается в комментариях.
Спасибо Вивеку Бансалу, Амару Илиндре и Узбекджону за это.
К сожалению, когда вы теряете хранилище ключей или пароль к хранилищу ключей, ваше приложение становится сиротой. Единственное, что вы можете сделать, — это повторно отправить свое приложение на рынок под новым ключом.
ALWAYS создайте резервную копию хранилища ключей и запишите пароли в безопасном месте.
В случае, если вводится неправильный пароль, даже один раз, он продолжает говорить при следующих попытках:
Взломано хранилище ключей или неверный пароль.
Даже если вы предоставите правильный ответ. Я пробовал это несколько раз, может быть, это какая-то защита.
Закройте мастер экспорта и запустите его снова с правильным паролем, теперь он работает 🙂
Скотина-твой лучший выбор!
Вот сценарий, который мне помог:
Вы можете дополнительно дать ему список слов, которые пароль может включать в себя для очень быстрого восстановления (для меня это сработало за Поделиться Artur 20 февраля 2014 в 22:23
Наконец, потратив два дня, я нашел решение.
Выполните следующие действия:
- Перейти к проекту
- В .gradle найдите папку с версией gradle, в моем случае это была 4.1 (см. рис)
- разверните папку 4.1, а затем в папке taskHistory вы найдете файл taskHistory.bin.
- Откройте файл taskHistory.bin в самом файле android studio.
- Найдите «.storePassword» .. Вот и все, что у вас есть пароль хранилища ключей.
Это действительно сработало для меня.
Попробуйте это и счастливого кодирования.
Мне нужно интегрировать приложение с внешним веб-сервисом, который заставляет использовать https. Авторы этого веб-сервиса предоставили мне файл .crt, который я должен использовать для выполнения запросов https. После некоторого расследования я нашел следующий код, который использует класс.
Некоторое время назад я разработал приложение android, но, к сожалению, потерял файл .keystore, но я знаю пароль хранилища ключей. Если я сгенерирую новый .keystore с тем же паролем, я смогу обновить свое приложение? Если нет, то есть ли у меня шанс восстановиться после того, как я переустановил.
SOLUTION 2019 (Windows, Android Studio 3.3, gradle 4.10 ):
Это решение работает только в том случае, если ранее было отмечено «Remember password» checkbox.
Во-первых, taskArtifacts.bin не существует для этой версии gradle, а idea.log показывает звездочки для паролей. Это были старые решения, которые не работали для меня.
Где я нашел пароли с открытым текстом: C:\Users\<имя пользователя>\AndroidStudioProjects\<проект>\app\build\intermediates\signing_config\release\out\signing-config.json
Ключи: mStorePassword и mKeyPassword.
Я очень надеюсь, что это поможет кому-то еще.
На MAC запустите консольную утилиту и прокрутите вниз до
/Library/Logs -> AndroidStudio ->idea.log.1 (или любого старого номера журнала) Затем я поискал «keystore», и он должен появиться где-то в журналах.
На самом деле потеря keystore password не является проблемой.
Вы можете создать новое хранилище ключей и установить для него новый пароль с помощью приведенной ниже команды keytool . Для этого вам не нужен оригинальный пароль хранилища ключей:
keytool -importkeystore -srckeystore path/to/keystore/with/forgotten/pw \
-destkeystore path/to/my/new.keystore
При появлении запроса создайте пароль для new.keystore , а для пароля исходного хранилища ключей (который вы потеряли) просто нажмите Enter .
Вы получите предупреждение о том, что целостность не проверена, и вы получите свой new.keystore, идентичный оригиналу, с новым паролем.
Причина , по которой это работает, заключается в том , что keystore password используется только для обеспечения целостности keystore , он не шифрует данные с его помощью, в отличие от private key password , который фактически хранит ваш закрытый ключ в зашифрованном виде.
Пожалуйста, обратите внимание, что вы должны знать свой private key password , чтобы подписывать свои приложения. Ну, если это то же самое, что и забытый keystore password , то вы можете прибегнуть к брутфорсу, как в ответе @Artur’s.
Этот подход всегда работал на меня.
Я чувствую, что мне нужно дать ответ, потому что это не может быть просто в комментариях. Как говорит @ElDoRado1239 в своем ответе (не забудьте озвучить его ответ 😉
- Ищет ..Project\.gradle\2.4\taskArtifacts\taskArtifacts.bin в моем случае был в ..Project\.gradle\2.2.1\taskArtifacts\taskArtifacts.bin , потому что я использую gradle 2.2.1
- Затем найдите storePassword , как @Moxet Хан говорит, что в comments. in мой случай был в строке signingConfig.storePassword¬í t my.forgoten.password—signingConfig.keyAlias
Надеюсь помочь кому-нибудь еще.
К счастью, я нашел свой потерянный пароль вместе с путем к хранилищу ключей и псевдонимом из моих журналов Android studio.
если вы используете машины на базе linux / Unix.
Перейдите в каталог журналов библиотеки
там, если вы помните свою версию android studio, которую вы использовали для создания последней версии APK. Перейдите в этот каталог
например : cd AndroidStudio1.5/
Там вы найдете файлы журналов. в любом из файлов журнала (idea.log) вы найдете свои учетные данные хранилища ключей
Я надеюсь, что это поможет для Android Studio пользователей
Это может быть немного поздно, но это наверняка кому-то поможет Вы можете искать пароль, если вы что-то помните, в противном случае попробуйте выполнить поиск, например
signingConfig.storePassword
кроме того, если вы забыли псевдоним ключа, вы можете найти здесь, который также ищет что-то вроде signingConfig.keyAlias
Надеюсь, это кому-то поможет
Для всех, кто может столкнуться с этим, я хотел бы поделиться ответом, который может иметь место для вас или для других, просматривающих эту статью (например, для меня).
Я использую Eclipse и создал в нем хранилище ключей для своего выпуска 1.0. Перенесемся на 3 месяца вперед, и я хотел обновить его до 1.1. Когда я выбрал Экспорт. в Eclipse и выбрал это хранилище ключей, ни один из моих паролей, которые я мог вспомнить, не сработал. Каждый раз, когда он говорил «Keystore tampered with or password incorrect.» , дело доходило до того, что я готовился запустить на нем программу грубой силы до тех пор, пока я мог выдержать (неделю или около того), чтобы попытаться заставить его работать.
К счастью, я подписал свой неподписанный файл .apk за пределами Eclipse. Вуаля — сработало! Мой пароль был верен все это время! Я не уверен, почему, но, подписав его в Eclipse через меню Экспорта, я сообщал об ошибке, даже если мой пароль был правильным.
Итак, если вы получаете эту ошибку, вот мои шаги (взятые из документации Android), которые помогут вам подготовить ваш apk к выходу на рынок.
NOTE: Чтобы получить неподписанный apk из Eclipse: Щелкните правой кнопкой мыши проект > Инструменты Android > Экспорт неподписанного приложения
Подпишите неподписанный файл apk с помощью хранилища ключей
a. откройте приглашение администратора cmd и перейдите в раздел «c:\Program Files\Java\jdk1.6.0_25\bin» или любую имеющуюся у вас версию java (где вы скопировали неподписанный файл apk и хранилище ключей)
b. в приглашении cmd с файлом хранилища ключей и без знака apk в том же каталоге введите следующую команду: jarsigner -keystore mykeystorename.keystore -verbose unsigned.apk myaliasnamefromkeystore
c. он скажет: «Enter Passphrase for keystore:». Введите его и нажмите кнопку Return.
d. ===> Успех выглядит так:
e. неподписанная версия перезаписывается на месте, поэтому ваш подписанный файл apk теперь имеет то же имя файла, что и неподписанный
Используйте ZipAlign для сжатия подписанного файла apk для распространения на рынке
a. откройте приглашение admin cmd и перейдите в «c:\AndroidSDK\tools» или туда, где вы установили Android SDK
b. введите следующую команду: zipalign -v 4 signed.apk signedaligned.apk
c. ===> Успех выглядит так:
d. подписанный и выровненный файл имеет значение signedaligned.apk (имя файла, указанное в предыдущей команде)
= = = = = = = = > ГОТОВ К ОТПРАВКЕ НА РЫНОК
Потратив почти целый день на изучение возможных вариантов восстановления потерянного пароля хранилища ключей в Android Studio. Я нашел следующие 4 возможных способа сделать это:
Используйте AndroidKeystoreBrute для получения пароля. Этот метод весьма полезен, когда вы частично забыли свой пароль, что означает, что у вас все еще есть некоторые подсказки о вашем пароле в вашем уме.
Вы также можете получить его через файлы журнала Android Studio, если вы ранее выпустили приложение(для которого вы нашли пароль хранилища ключей) на той же машине. Обратитесь к следующему каталогу:
Mac OSX
Linux (Возможное Местоположение)
Windows (Возможное Местоположение)
и найдите Pandroid.injected.signing.key.password внутри файла. Вы увидите пароль, если вы ранее подписали приложение с той же версией Android Studio, в которой вы сейчас ищете.
Вы также можете получить пароль через каталог .gradle вашего проекта. Найдите следующий путь
Примечание: Это, похоже, не работает для более новых версий Gradle (2.10 и выше).
Если ни одно из вышеперечисленных решений не работает, вы можете попробовать это, но для этого также у вас должно быть приложение Android Studio IDE или его настройки, в которых пароль хранилища ключей вашего проекта был сохранен ранее (используя опцию Запомнить пароль во время подписания приложения). Вы можете получить настройки IDE по следующему пути:
Mac OSX
Linux (Возможное Местоположение)
Windows (Возможное Местоположение)
Просто используйте старый Android Studio IDE, если у вас есть или импортируйте настройки старого IDE в новый IDE, а также поместите файл хранилища ключей в тот же путь, где он был ранее, когда вы его подписали, и сохраните пароль в последний раз.
Таким образом, как только вы откроете проект и попробуете Build->Generate Signed APK и выберите файл хранилища ключей из более старого расположения. Он автоматически получит пароль и продолжит генерировать подписанный APK для выпуска.
Как только релиз APK будет успешно сгенерирован, вы можете следовать варианту 2, упомянутому ранее, чтобы проверить свой пароль из файла журнала для недавно сгенерированного релиза APK.
Сначала загрузите AndroidKeystoreBrute_v1.05.jar, а затем следуйте приведенному изображению.
Источник