2009-01-15 8 views
8

Je pense que cela doit être une question stupide, mais pourquoi les résultats de urlsafe_b64encode() se terminent toujours par un '=' pour moi? '=' n'est pas sûr pour l'URL?urlsafe_b64encode se termine toujours par '='?:

from random import getrandbits 
from base64 import urlsafe_b64encode 
from hashlib import sha256 
from time import sleep 

def genKey(): 
    keyLenBits = 64 
    a = str(getrandbits(keyLenBits)) 
    b = urlsafe_b64encode(sha256(a).digest()) 
    print b 

while 1: 
    genKey() 
    sleep(1) 

sortie:

DxFOVxWvvzGdOSh2ARkK-2XPXNavnpiCkD6RuKLffvA= 
xvA99ZLBrLvtf9-k0-YUFcLsiKl8Q8KmkD7ahIqPZ5Y= 
jYbNK7j62KCBA5gnoiSpM2AGOPxmyQTIJIl_wWdOwoY= 
CPIKkXPfIX4bd8lQtUj1dYG3ZOBxmZTMkVpmR7Uvu4s= 
HlTs0tBW805gaxfMrq3OPOa6Crg7MsLSLnqe-eX0JEA= 
FKRu0ePZEppHsvACWYssL1b2uZhjy9UU5LI8sWIqHe8= 
aY_kVaT8kjB4RRfp3S6xG2vJaL0vAwQPifsBcN1LYvo= 
6Us3XsewqnEcovMb5EEPtf4Fp4ucWfjPVso-UkRuaRc= 
_vAI943yOWs3t2F6suUGy47LJjQsgi_XLiMKhYZnm9M= 
CcUSXVqPNT_eb8VXasFXhvNosPOWQQWjGlipQp_68aY= 
+0

Je pense que le '=' utilisé dans un contexte autre que la transmission d'arguments est source de confusion pour le framework web que j'utilise, même s'il est strictement sécurisé. – sparklewhiskers

Répondre

6

Base64 utilise '=' pour le remplissage. La longueur de votre chaîne n'est pas divisible par 24, donc elle est complétée par '='. Par ailleurs, '=' devrait être sûr d'URL car il est souvent utilisé pour les paramètres dans les URL.

Voir aussi this discussion.

+2

Comme vous l'avez dit "= '.. [est souvent utilisé pour les paramètres dans les URL", il n'est pas sûr pour les URL dans la partie paramètres de la requête de l'URL - Le point de la sécurité URL est de ne pas avoir chaîne. – joar

2

Le '=' est pour le remplissage. Si vous souhaitez transmettre la sortie en tant que valeur d'un paramètre d'URL, vous devez d'abord l'échapper, afin que le remplissage ne soit pas perdu lors de la lecture ultérieure dans la valeur.

import urllib 
param_value = urllib.quote_plus(b64_data) 

Python ne fait que suivre RFC3548 en permettant la « = » pour le remplissage, même si elle semble un caractère plus approprié devrait le remplacer.

1

Je m'attendrais à ce qu'un analyseur d'URI ignore un "=" dans la partie valeur d'un paramètre. Les paramètres URI sont les suivants: "&", [nom], "=", [valeur], puis un signe égal dans la partie valeur est inoffensif. Une esperluette non échappée a plus de potentiel pour casser l'analyseur.

Questions connexes