Retrouvez le mot de passe égaré de votre magasin de clés Android enregistré dans un projet FireMonkey

Il peut nous arriver à tous d'égarer des choses ou d'oublier de noter certaines informations pourtant vitales pour nos projets. il se trouve que ce fut mon cas pour Promo Verif. Je n'ai pas fait de mises à jour dessus pendant plusieurs années et il m'a finalement fallu retrouver le mot de passe du keystore car Google Play nous demande une clé privée pour les mises à jour d'anciennes applications mobiles.

Après avoir fouillé mes archives et disques durs, rien de concluant, puis m'est venue une idée saugrenue : faire appel à Delphi pour me fournir le mot de passe que l'IDE stocke de façon chiffrée.

La chaîne de compilation et de déploiement fait appel à des programmes en ligne de commande. Le mot de passe chiffré dans Delphi est donc utilisé quelque part en clair car le SDK Android ne connaît pas sa clé de chiffrement.

Il se trouve que la commande utilisée pour signer les fichiers APK et bundles AAB est apksigner.exe. Cette commande n'est pas lancée directement par l'IDE mais par le PAServer local utilisé en douce lors du déploiement d'un projet Android en 32 ou 64 bits. C'est la commande paclient.exe de RAD Studio qui est utilisée par l'IDE pour ça.

Afin de remonter la chaîne jusqu'à la bonne ligne de commande et l'afficher, c'est assez simple (encore faut-il y penser):

- ouvrez le projet dont vous voulez récupérer la clé

- vous devez bien entendu avoir le magasin de clés et il doit être correctement configuré dans les options de projet

- mettez vous en configuration RELEASE et en "Magasin d'application" pour la plateforme Android en 32 ou 64 bits selon vos besoins

- lancez une compilation (option "Projet / Compiler" ou Ctrl+F9) ou construction (option "Projet / Construire" ou Maj+F9)

- lancez un déploiement (option "Projet / Déployer" ou Maj+Ctrl+Alt+F9)

- affichez les messages de sortie du compilateur (soit déjà ouverts, soit depuis l'option "Voir / Fenêtres d'outils / Messages" ou Maj+Alt+M)

- en bas de la liste vous devriez avoir une ligne ressemblant à celle-ci (dans mon cas en Delphi 11.3 Alexandria):

Ligne de commande paclient
  c:\program files (x86)\embarcadero\studio\22.0\bin\paclient.exe -u8 --apksign="C:\Program Files\Eclipse Adoptium\jdk-11.0.15.10-hotspot\bin\java.exe,C:\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepository\AndroidSDK-2525-22.0.47991.2819\build-tools\32.0.0\lib\apksigner.jar,.\Android\Release\PromoVerif\bin\PromoVerif.apk,promoverif,..\_PRIVATE\promoverif-android.keystore,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,1"

- copiez la puis ouvrez une fenêtre du terminal de commandes

- ajoutez des guillemets autour du chemin de paclient.exe s'il contient des espaces, mettez un nom bidon pour le fichier .keystore et ajoutez l'option "-v" à la ligne copiée avant de l'exécuter :

"c:\program files (x86)\embarcadero\studio\22.0\bin\paclient.exe" -u8 --apksign="C:\Program Files\Eclipse Adoptium\jdk-11.0.15.10-hotspot\bin\java.exe,C:\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepository\AndroidSDK-2525-22.0.47991.2819\build-tools\32.0.0\lib\apksigner.jar,.\Android\Release\PromoVerif\bin\PromoVerif.apk,promoverif,bidule.keystore,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,1" -v

- en sortie avec une erreur vous devriez avoir la vraie commande lancée pour signer le fichier APK ou AAB comme ici :

"C:\Program Files\Eclipse Adoptium\jdk-11.0.15.10-hotspot\bin\java.exe" -jar "C:\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepository\AndroidSDK-2525-22.0.47991.2819\build-tools\32.0.0\lib\apksigner.jar" sign --ks "bidule.keystore" --ks-pass pass:KeystorePassword --ks-key-alias "promoverif" --key-pass pass:KeystoreAliasPassword "c:\Program Files (x86)\Embarcadero\Studio\22.0\bin\Android\Release\PromoVerif\bin\PromoVerif.apk"

Grâce à cette procédure vous voilà en possession du mot de passe du magasin de clés (derrière "--ks-pass pass:XXX") et de l'alias utilisé par ce projet (derrière --key-pass pass:XXX).

L'autre solution si vous n'avez pas le magasin de clé est de contacter le support de Google Play pour leur demander de réinitialiser le certificat utilisé pour soumettre votre application. Pour des raisons de sécurité vous devrez être connecté à la console Google Play.

A savoir : le mot de passe pour le magasin de clés (fichier keystore) et l'alias de votre projet sont présents dans le fichier dproj de votre projet (mais chiffrés). Nul n'est censé pouvoir en déduire le vrai mot de passe sauf à avoir les codes sources de la version de production RAD Studio, ou accès à votre keystore et pouvoir suivre la procédure décrite ici.

Ne publiez donc jamais le keystore (ni les mots de passe en clair) dans le dépôt de code qui stocke votre projet. en faisant ça n'importe qui tombant sur les sources pourra bidouiller votre application et trouver un moyen pour la soumettre à votre place sur les magasins d'application ou en direct vers vos utilisateurs.

Utilisez des magasins de clés différents pour chaque projet et n'utilisez jamais le même mot de passe dessus !

Bien entendu n'utilisez pas la technique décrite ici pour piquer les mots de passes de projets qui ne sont pas les vôtres...


Mug Chinese New Year 2023 : year of the rabbitMug Pascal case in Alexandrie