Pregunta

Creo que esta debe ser una pregunta estúpida, pero ¿por qué los resultados de urlsafe_b64encode () siempre terminan con un '=' para mí? '=' ¿no es segura la URL?

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=
¿Fue útil?

Solución

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

Consulte esta discusión también.

Otros consejos

El '=' es para relleno. Si desea pasar la salida como el valor de un parámetro de URL, primero querrá escapar de él, para que el relleno no se pierda cuando luego se lea el valor.

import urllib
param_value = urllib.quote_plus(b64_data)

Python solo está siguiendo RFC3548 al permitir el '=' para el relleno, a pesar de que parece que un carácter más adecuado debería reemplazarlo.

Esperaría que un analizador de URI ignore un " = " en la parte del valor de un parámetro.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top