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 encodée en base64, j'ai besoin d'une erreur. Comment puis-je vérifier si la chaîne a été codée en base64?
Vous pouvez utiliser l'expression régulière suivante pour vérifier si une chaîne est codée en base64 ou non:
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
En codage base64, le jeu de caractères est [A-Z, a-z, 0-9, and + /]
. Si la longueur au repos est inférieure à 4, la chaîne est complétée avec des caractères '='
.
^([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 sous l’une des trois formes suivantes: [A-Za-z0-9+/]{4}
, [A-Za-z0-9+/]{3}=
ou [A-Za-z0-9+/]{2}==
.
Si vous utilisez Java, vous pouvez réellement utiliser commons-codec library
import org.Apache.commons.codec.binary.Base64;
String stringToBeChecked = "...";
boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes());
Bien, vous pouvez:
Si vous vous attendez à ce que soit soit base64, vous pouvez probablement utiliser la bibliothèque disponible sur votre plate-forme pour essayer de le décoder en un tableau d'octets, en lançant une exception si elle n'est pas valide 64. Cela dépend de votre plate-forme, bien sûr.
Essayez comme ça 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";
}
A partir de Java 8, vous pouvez simplement utiliser Java.util.Base64 pour essayer de décoder la chaîne:
String someString = "...";
Base64.Decoder decoder = Base64.getDecoder();
try {
decoder.decode(someString);
} catch(IllegalArgumentException iae) {
// That string wasn't valid.
}
Vérifiez si SI la longueur de la chaîne est un multiple de 4. A l'aide de cette expression rationnelle, assurez-vous que tous les caractères de la chaîne sont des caractères base64.
\A[a-zA-Z\d\/+]+={,2}\z
Si la bibliothèque que vous utilisez ajoute une nouvelle ligne pour pouvoir observer la règle des 76 caractères maximum par ligne, remplacez-la par des chaînes vides.
Il existe de nombreuses variantes de Base64 , vous devez donc déterminer si votre chaîne ressemble à la variante que vous comptez gérer. En tant que tel, vous devrez peut-être ajuster l'expression régulière ci-dessous par rapport à l'index et aux caractères de remplissage (c'est-à-dire +
, /
, =
).
class String
def resembles_base64?
self.length % 4 == 0 && self =~ /^[A-Za-z0-9+\/=]+\Z/
end
end
Usage:
raise 'the string does not resemble Base64' unless my_string.resembles_base64?
var base64Rejex = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i;
var isBase64Valid = base64Rejex.test(base64Data); // base64Data is the base64 string
if (isBase64Valid) {
// true if base64 formate
console.log('It is base64');
} else {
// false if not in base64 formate
console.log('it is not in base64');
}
/^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/
cette expression régulière m'a aidé à identifier le base64 dans mon application dans Rails, je n'avais qu'un problème, c'est qu'il reconnaît la chaîne "errorDescripcion", je génère une erreur, pour le résoudre, il suffit de valider la longueur d'une chaîne.
C # Cela fonctionne très bien:
static readonly Regex _base64RegexPattern = new Regex(BASE64_REGEX_STRING, RegexOptions.Compiled);
private const String BASE64_REGEX_STRING = @"^[a-zA-Z0-9\+/]*={0,3}$";
private static bool IsBase64(this String base64String)
{
var rs = (!string.IsNullOrEmpty(base64String) && !string.IsNullOrWhiteSpace(base64String) && base64String.Length != 0 && base64String.Length % 4 == 0 && !base64String.Contains(" ") && !base64String.Contains("\t") && !base64String.Contains("\r") && !base64String.Contains("\n")) && (base64String.Length % 4 == 0 && _base64RegexPattern.Match(base64String, 0).Success);
return rs;
}
Si le RegEx ne fonctionne pas et que vous connaissez le style de format de la chaîne d'origine, vous pouvez inverser la logique en utilisant une expression régulière pour ce format.
Par exemple, je travaille avec des fichiers xml encodés en base64 et je vérifie simplement si le fichier contient un balisage xml valide. Si ce n'est pas le cas, je peux supposer qu'il est décodé en base64. Ce n'est pas très dynamique mais fonctionne bien pour ma petite application.
Il est impossible de vérifier si une chaîne est codée en base64 ou non. Il n’est possible de valider que si cette chaîne est au format chaîne encodé en base64, ce qui voudrait dire qu’il s’agirait d’une chaîne produite par encodage en base64 d’autres réponses à cette question fournissent de bons moyens de vérifier cela, aussi je n’entrerai pas dans les détails).
Par exemple, chaîne flow
est une chaîne codée en base64 valide. Mais il est impossible de savoir s’il s’agit d’une simple chaîne, d’un mot anglais flow
, ou s’il s’agit d’une chaîne encodée en base 64 ~Z0
Cela fonctionne en Python:
def is_base64(string):
if len(string) % 4 == 0 and re.test('^[A-Za-z0-9+\/=]+\Z', string):
return(True)
else:
return(False)
Il n’existe aucun moyen de distinguer les chaînes et les codages en base64, sauf que la chaîne de votre système a une limitation ou une identification spécifique.
Cela fonctionne en Python:
import base64
def IsBase64(str):
try:
base64.b64decode(str)
return True
except Exception as e:
return False
if IsBase64("ABC"):
print("ABC is Base64-encoded and its result after decoding is: " + str(base64.b64decode("ABC")).replace("b'", "").replace("'", ""))
else:
print("ABC is NOT Base64-encoded.")
if IsBase64("QUJD"):
print("QUJD is Base64-encoded and its result after decoding is: " + str(base64.b64decode("QUJD")).replace("b'", "").replace("'", ""))
else:
print("QUJD is NOT Base64-encoded.")
Résumé: IsBase64("string here")
renvoietruesi string here
est codé en Base64, et il renvoiefalsesi string here
n'était PAS codé en Base64.
Essaye ça:
public void checkForEncode(String string) {
String pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(string);
if (m.find()) {
System.out.println("true");
} else {
System.out.println("false");
}
}
Cet extrait peut être utile lorsque vous connaissez la longueur du contenu d'origine (par exemple, une somme de contrôle). Il vérifie que la forme encodée a la bonne longueur.
public static boolean isValidBase64( final int initialLength, final String string ) {
final int padding ;
final String regexEnd ;
switch( ( initialLength ) % 3 ) {
case 1 :
padding = 2 ;
regexEnd = "==" ;
break ;
case 2 :
padding = 1 ;
regexEnd = "=" ;
break ;
default :
padding = 0 ;
regexEnd = "" ;
}
final int encodedLength = ( ( ( initialLength / 3 ) + ( padding > 0 ? 1 : 0 ) ) * 4 ) ;
final String regex = "[a-zA-Z0-9/\\+]{" + ( encodedLength - padding ) + "}" + regexEnd ;
return Pattern.compile( regex ).matcher( string ).matches() ;
}