Cómo comprobar si una cadena está codificada en Base64 o no

Resuelto loganathan asked hace 12 años • 27 respuestas

Quiero decodificar una cadena codificada en Base64 y luego almacenarla en mi base de datos. Si la entrada no está codificada en Base64, debo generar un error.

¿Cómo puedo comprobar si una cadena está codificada en Base64?

loganathan avatar Dec 20 '11 13:12 loganathan
Aceptado

Puede utilizar la siguiente expresión regular para comprobar si una cadena constituye una codificación base64 válida:

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

En la codificación base64, el juego de caracteres es [A-Z, a-z, 0-9, and + /]. Si la longitud del resto es inferior a 4, la cadena se rellena con '='caracteres.

^([A-Za-z0-9+/]{4})*significa que la cadena comienza con 0 o más grupos base64.

([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$significa que la cadena termina en una de tres formas [A-Za-z0-9+/]{4}: [A-Za-z0-9+/]{3}=o [A-Za-z0-9+/]{2}==.

xuanyuanzhiyuan avatar Dec 20 '2011 06:12 xuanyuanzhiyuan

Si está utilizando Java, puede utilizar la biblioteca commons-codec

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

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

[ACTUALIZACIÓN 1] Uso del aviso de obsolescencia en su lugar

Base64.isBase64(valor);

   /**
     * 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);
    }
zihaoyu avatar Jan 08 '2013 15:01 zihaoyu

Bien tu puedes:

  • Comprueba que la longitud sea múltiplo de 4 caracteres.
  • Verifique que todos los caracteres estén en el conjunto AZ, az, 0-9, +, / excepto el relleno al final que es 0, 1 o 2 caracteres '='

Si espera que sea base64 , entonces probablemente pueda usar cualquier biblioteca que esté disponible en su plataforma para intentar decodificarla en una matriz de bytes, generando una excepción si no es base 64 válida. Eso depende de su plataforma. por supuesto.

Jon Skeet avatar Dec 20 '2011 06:12 Jon Skeet

A partir de Java 8, simplemente puedes usar java.util.Base64 para intentar decodificar la cadena:

String someString = "...";
Base64.Decoder decoder = Base64.getDecoder();

try {
    decoder.decode(someString);
} catch(IllegalArgumentException iae) {
    // That string wasn't valid.
}
Philippe avatar Mar 05 '2016 21:03 Philippe

Prueba así para 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"; 
}

Utilice esto para 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.
    return base64_decode($string, true) !== false;
}
Suneel Kumar avatar Nov 22 '2013 13:11 Suneel Kumar