2009-01-15 28 views
8

Creo que esto debe ser una pregunta estúpida, pero ¿por qué los resultados de urlsafe_b64encode() siempre terminan con un '=' para mí? '=' ¿no es url seguro?urlsafe_b64encode siempre termina en '='?:

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) 

salida:

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

Creo que el '=' usado en un contexto que no sea pasar argumentos confunde el marco web que estoy usando, incluso si es estrictamente seguro para las direcciones URL. – sparklewhiskers

Respuesta

6

Base64 utiliza '=' para el relleno. La longitud del bit de cadena no es divisible por 24, por lo que se rellena con '='. Por cierto, '=' debería ser seguro para URL ya que a menudo se usa para parámetros en URL.

Véase this discussion, también.

+2

Como dijiste "'=' .. [es] a menudo utilizado para parámetros en URLs", no es seguro para URL en el parámetro de consulta parte de la URL. El punto de seguridad de URL es no tener caracteres de URL especiales en el cuerda. – joar

2

El '=' es para relleno. Si desea pasar el resultado como el valor de un parámetro de URL, primero querrá escapar, para que el relleno no se pierda cuando más tarde lea el valor.

import urllib 
param_value = urllib.quote_plus(b64_data) 

Python es simplemente siguiendo RFC3548 al permitir que el '=' para el relleno, a pesar de que parece como un personaje más adecuado debe reemplazarlo.

1

Me esperaba que un analizador URI ignoraría un "=" en la parte de valor de un parámetro.

Los parámetros de URI son: "&", [nombre], "=", [valor], a continuación, por lo que un signo igual en la parte de valor es inofensivo. Un ampersand sin escamas tiene más potencial para romper el analizador sintáctico.

Cuestiones relacionadas