Pourquoi mon base64 décodé ressemble-t-il à du bruit ?
Vous avez décodé quelque chose et obtenu une suite de caractères sans sens, de points d’interrogation ou de symboles de remplacement. Il y a à cela deux raisons assez différentes, et elles appellent des réponses opposées : mieux vaut donc savoir laquelle vous avez sous les yeux.
La première est que votre entrée n’a jamais été du base64. L’alphabet du base64 se compose de lettres, de chiffres, du plus et de la barre oblique — ce qui veut dire qu’énormément de texte ordinaire passe pour du base64 valide par sa seule forme. Une empreinte hexadécimale, un UUID sans tirets, un hash de commit git et de simples mots anglais comme "test" ou "Password" franchissent n’importe quelle vérification de caractères. Les décoder est une opération licite qui produit des octets qui n’ont jamais été du texte, donc le résultat est du bruit. Le décodeur n’a pas échoué : il a répondu à une question que vous ne vouliez pas poser.
La seconde est que l’entrée était bien du base64 et que la charge n’est simplement pas du texte. Le base64 existe pour transporter des octets quelconques par des canaux qui n’acceptent que des caractères, et ces octets sont souvent une image, une archive compressée, un certificat, un message protobuf ou un bloc chiffré. Le décodage a parfaitement fonctionné. Ce qui en est sorti n’a jamais été destiné à être lu comme des lettres.
On les distingue en général aux premiers octets du résultat. Un PNG commence par les lettres PNG après un octet non imprimable ; un flux gzip commence par deux octets fixes ; un PDF porte une marque visible au début ; un certificat sous forme DER commence par un octet de structure et non par quelque chose de lisible. Si la sortie commence par une signature reconnaissable, vous avez de vraies données dans un format, et non un décodage raté.
L’autre vérification est la réversibilité. Réencodez le résultat et comparez-le à ce dont vous êtes parti. Le vrai base64 fait l’aller-retour à l’identique. Une valeur qui n’avait que la forme du base64 le fait rarement, parce que sa longueur ou son remplissage ne sont jamais sortis d’un encodeur.
Cela compte surtout pour les outils qui décodent à répétition. Un outil qui continue tant que l’entrée a encore l’air décodable finira par détruire une valeur parfaitement saine en la décodant une fois de trop, et annoncera un nombre de couches incluant une couche qui n’a jamais existé. S’arrêter au bon endroit, et dire pourquoi, est la partie réellement difficile.