Pergunta

Eu acho que isso deve ser uma pergunta estúpida, mas por que os resultados de urlsafe_b64encode () sempre terminam com um '=' para mim? '=' Não é seguro 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)

saída:

DxFOVxWvvzGdOSh2ARkK-2XPXNavnpiCkD6RuKLffvA=
xvA99ZLBrLvtf9-k0-YUFcLsiKl8Q8KmkD7ahIqPZ5Y=
jYbNK7j62KCBA5gnoiSpM2AGOPxmyQTIJIl_wWdOwoY=
CPIKkXPfIX4bd8lQtUj1dYG3ZOBxmZTMkVpmR7Uvu4s=
HlTs0tBW805gaxfMrq3OPOa6Crg7MsLSLnqe-eX0JEA=
FKRu0ePZEppHsvACWYssL1b2uZhjy9UU5LI8sWIqHe8=
aY_kVaT8kjB4RRfp3S6xG2vJaL0vAwQPifsBcN1LYvo=
6Us3XsewqnEcovMb5EEPtf4Fp4ucWfjPVso-UkRuaRc=
_vAI943yOWs3t2F6suUGy47LJjQsgi_XLiMKhYZnm9M=
CcUSXVqPNT_eb8VXasFXhvNosPOWQQWjGlipQp_68aY=
Foi útil?

Solução

Base64 usa '=' para preenchimento. Seu comprimento cadeia de bits não é divisível por 24, por isso é preenchido com '='. By the way, '=' deve ser URL segura como é muitas vezes usado para os parâmetros em URLs.

Consulte esta discussão também.

Outras dicas

O '=' é para estofamento. Se você quer passar a saída como o valor de um parâmetro de URL, você vai querer escapar pela primeira vez, de modo que o preenchimento não se perde quando depois de ler o valor.

import urllib
param_value = urllib.quote_plus(b64_data)

Python é apenas seguindo RFC3548, permitindo que o '=' para preenchimento, mesmo que pareça como um personagem mais adequado deve substituí-lo.

Eu esperaria que um analisador URI seria ignorar a "=" na parte do valor de um parâmetro.

Os URI parâmetros são: "&", [nome], "=", [valor], ao lado, por isso, um sinal de igual na parte do valor é inofensivo. Um e comercial unescaped tem mais potencial para quebrar o analisador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top