231 votes

Comment vérifier si une chaîne de caractères est encodée en Base64 ou non ?

Je veux décoder une chaîne encodée en Base64, puis la stocker dans ma base de données. Si l'entrée n'est pas codée en Base64, je dois envoyer une erreur.

Comment puis-je vérifier si une chaîne de caractères est encodée en Base64 ?

1 votes

Pourquoi ? Comment la situation peut-elle se présenter ?

2 votes

Sans préciser le langage de programmation (et/ou) le système d'exploitation que vous visez, la question est très ouverte.

7 votes

Tout ce que vous pouvez déterminer est que la chaîne ne contient que des caractères valides pour une chaîne codée en base64. Il se peut qu'il ne soit pas possible de déterminer que la chaîne est la version codée en base64 de certaines données. par exemple test1234 est une chaîne valide codée en base64, et lorsque vous la décodez, vous obtenez quelques octets. Il n'y a aucun moyen indépendant de l'application de conclure que test1234 n'est pas une chaîne codée en base64.

289voto

xuanyuanzhiyuan Points 713

Vous pouvez utiliser l'expression régulière suivante pour vérifier si une chaîne constitue un encodage base64 valide :

^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$

En codage base64, le jeu de caractères est le suivant [A-Z, a-z, 0-9, and + /] . Si la longueur restante est inférieure à 4, la chaîne est complétée par '=' des personnages.

^([A-Za-z0-9+/]{4})* signifie que la chaîne commence par 0 ou plusieurs groupes base64.

([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$ signifie que la chaîne se termine par l'une des trois formes suivantes : [A-Za-z0-9+/]{4} , [A-Za-z0-9+/]{3}= o [A-Za-z0-9+/]{2}== .

15 votes

Je voulais juste vérifier, alors aidez-moi avec ma question : Quelle est la garantie que cette regex se réfère toujours à une chaîne de caractères en base64 ? S'il y a une chaîne sans espace et multiple de 4 caractères, alors cette chaîne sera-t-elle considérée comme une chaîne base64 ????

4 votes

Il s'agit alors d'une chaîne base64 valide qui peut être décodée. Vous pourriez ajouter une contrainte de longueur minimale ; par exemple, au lieu de zéro ou plus répétitions de groupes de quatre, exigez (disons) quatre ou plus. Cela dépend aussi de votre problème ; si vos utilisateurs saisissent souvent un seul mot dans une langue avec des mots longs et de l'ASCII pur (hawaïen ?), il y a plus d'erreurs que si la saisie non-base64 contient généralement des espaces, de la ponctuation, etc.

0 votes

@Didier Ghys il semble que cette chaîne encodée en base64 IHRlc3QgbWVzc2FnZQoK ne correspond pas à la regex. Ou peut-être qu'il n'est pas codé en base64 ? bien que base64_decode('IHRlc3QgbWVzc2FnZQoK') produise une chaîne écrite - test message

61voto

zihaoyu Points 922

Si vous utilisez Java, vous pouvez en fait utiliser commons-codec bibliothèque

import org.apache.commons.codec.binary.Base64;

String stringToBeChecked = "...";
boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes());

[UPDATE 1] Avis de dépréciation Utilisez plutôt

Base64.isBase64(valeur) ;

   /**
     * Tests a given byte array to see if it contains only valid characters within the Base64 alphabet. Currently the
     * method treats whitespace as valid.
     *
     * @param arrayOctet
     *            byte array to test
     * @return {@code true} if all bytes are valid characters in the Base64 alphabet or if the byte array is empty;
     *         {@code false}, otherwise
     * @deprecated 1.5 Use {@link #isBase64(byte[])}, will be removed in 2.0.
     */
    @Deprecated
    public static boolean isArrayByteBase64(final byte[] arrayOctet) {
        return isBase64(arrayOctet);
    }

22 votes

De la documentation : isArrayByteBase64(byte[] arrayOctet) Déprécié. 1.5 Utilisation isBase64(byte[]) sera supprimé dans la version 2.0.

8 votes

Vous pouvez également utiliser Base64.isBase64(String base64) au lieu de le convertir vous-même en tableau d'octets.

5 votes

Malheureusement, d'après la documentation : commons.apache.org/proper/commons-codec/apidocs/org/apache/ : "Teste une chaîne donnée pour voir si elle ne contient que des caractères valides dans l'alphabet Base64. Actuellement, la méthode traite les espaces blancs comme valides." Cela signifie que cette méthode a quelques faux positifs comme les "espaces blancs" ou les nombres ("0", "1").

52voto

Jon Skeet Points 692016

Et bien tu peux :

  • Vérifiez que la longueur est un multiple de 4 caractères.
  • Vérifiez que chaque caractère fait partie de l'ensemble A-Z, a-z, 0-9, +, /, à l'exception du remplissage à la fin qui est constitué de 0, 1 ou 2 caractères '='.

Si vous vous attendez à ce qu'il sera soit en base64, alors vous pouvez probablement utiliser n'importe quelle bibliothèque disponible sur votre plateforme pour essayez pour le décoder en un tableau d'octets, en levant une exception s'il n'est pas valide en base 64. Cela dépend de votre plate-forme, bien sûr.

0 votes

L'analyse syntaxique diffère de la validation au moins par le fait qu'elle nécessite de la mémoire pour le tableau d'octets décodés. Ce n'est donc pas l'approche la plus efficace dans certains cas.

2 votes

@VictorYarema : J'ai suggéré à la fois une approche de validation uniquement (points) et également une approche d'analyse syntaxique (après les points).

16voto

Sunil omrey Points 178

Essayez comme ceci pour PHP5

//where $json is some data that can be base64 encoded
$json=some_data;

//this will check whether data is base64 encoded or not
if (base64_decode($json, true) == true)
{          
   echo "base64 encoded";          
}
else 
{
   echo "not base64 encoded"; 
}

Utilisez ceci pour PHP7

 //$string parameter can be base64 encoded or not

function is_base64_encoded($string){
 //this will check if $string is base64 encoded and return true, if it is.
 if (base64_decode($string, true) !== false){          
   return true;        
 }else{
   return false;
 }
}

2 votes

De quelle langue s'agit-il ? La question a été posée sans faire référence à une langue

0 votes

Cela ne fonctionnera pas. lisez la documentation Returns FALSE if input contains character from outside the base64 alphabet. base64_decode

2 votes

Comment ? Si l'entrée contient un caractère extérieur, alors elle n'est pas en base64, n'est-ce pas ?

5voto

Yaw Points 2210

Vérifier pour voir SI la longueur de la chaîne est un multiple de 4. Ensuite, utilisez cette regex pour vous assurer que tous les personnages dans la chaîne sont des caractères en base64.

\A[a-zA-Z\d\/+]+={,2}\z

Si la bibliothèque que vous utilisez ajoute une nouvelle ligne pour respecter la règle des 76 caractères maximum par ligne, remplacez-les par des chaînes vides.

0 votes

Le lien mentionné affiche 404. Veuillez vérifier et mettre à jour.

0 votes

Désolé @AnkurKumar mais c'est ce qui arrive quand les gens ont des URLs pas cool : elles changent tout le temps. Je n'ai aucune idée de l'endroit où il a été déplacé. J'espère que vous trouverez d'autres ressources utiles grâce à Google

0 votes

Vous pouvez toujours récupérer les anciennes pages sur web.archive.org - voici l'url d'origine. web.archive.org/web/20120919035911/http://… ou j'ai posté le texte ici : gist.github.com/mika76/d09e2b65159e435e7a4cc5b0299c3e84

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X