web-dev-qa-db-fra.com

vérifie si une chaîne est codée en python base64

Existe-t-il un moyen efficace de vérifier si une chaîne est codée en base 64 avec python?

Je vous remercie

19
lizzie

Ce n'est pas possible Le mieux que vous puissiez faire est de vérifier qu’une chaîne peut être valide en Base 64, bien que de nombreuses chaînes composées uniquement de texte ASCII puissent être décodées comme si elles étaient en Base 64.

7
Wooble
import base64
import binascii

try:
    base64.decodestring("foo")
except binascii.Error:
    print "no correct base64"
31
user647772

Je cherchais une solution au même problème, puis une très simple m'a frappé à la tête. Tout ce que vous avez à faire est de décoder, puis de ré-encoder. Si la chaîne recodée est égale à la chaîne codée, elle est codée en base64.
Voici le code:

import base64

def isBase64(s):
    try:
        return base64.b64encode(base64.b64decode(s)) == s
    except Exception:
        return False

C'est tout!

Edit: Voici une version de la fonction qui fonctionne à la fois avec les objets string et bytes dans Python 3:

import base64

def isBase64(sb):
        try:
                if type(sb) == str:
                        # If there's any unicode here, an exception will be thrown and the function will return false
                        sb_bytes = bytes(sb, 'ascii')
                Elif type(sb) == bytes:
                        sb_bytes = sb
                else:
                        raise ValueError("Argument must be string or bytes")
                return base64.b64encode(base64.b64decode(sb_bytes)) == sb_bytes
        except Exception:
                return False
15
id01

si la longueur de la chaîne encodée est le temps de 4, elle peut être décodée

base64.encodestring("whatever you say").strip().__len__() % 4 == 0

alors, il vous suffit de vérifier si la chaîne peut correspondre à quelque chose comme ci-dessus, alors elle ne lèvera aucune exception (I Guess =. =)

if len(the_base64string.strip()) % 4 == 0:
    # then you can just decode it anyway
    base64.decodestring(the_base64string)
2
hell flame
def is_base64(s):
    s = ''.join([s.strip() for s in s.split("\n")])
    try:
        enc = base64.b64encode(base64.b64decode(s)).strip()
        return enc == s
    except TypeError:
        return False

Dans mon cas, mon entrée, s, avait des nouvelles lignes que je devais supprimer avant la comparaison.

1
skyler
x = 'possibly base64 encoded string'
result = x
try:
   decoded = x.decode('base64', 'strict')
   if x == decoded.encode('base64').strip():
       result = decoded
except:
   pass

ce code met dans la chaîne de résultat décodée la variable de résultat si x est réellement encodé, et juste si sinon. Essayer de décoder ne fonctionne pas toujours.

0
Andy

@geoffspear a raison de dire que ce n'est pas possible à 100% mais vous pouvez vous en rapprocher en vérifiant l'en-tête de la chaîne pour voir si elle correspond à celle d'une chaîne codée en base64 (re: Comment vérifier si une chaîne est codée en base64 ou non ).

# check if a string is base64 encoded.
def isBase64Encoded(s):
    pattern = re.compile("^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$")
    if not s or len(s) < 1:
        return False
    else:
        return pattern.match(s)

De plus, dans mon cas, je voulais renvoyer la valeur false si la chaîne est vide pour éviter le décodage, car rien ne sert de décodage.

0
DRAD