2009-01-15 8 views
8

Ich denke, das muss eine dumme Frage sein, aber warum enden die Ergebnisse von urlsafe_b64encode() immer mit einem '=' für mich? '=' ist nicht sicher?urlsafe_b64encode endet immer in '='?:

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) 

output:

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

Ich denke, dass das '=' in einem anderen Kontext als die Weitergabe von Argumenten verwirrend das Web-Framework, das ich benutze, auch wenn es streng url sicher ist. – sparklewhiskers

Antwort

6

Base64 verwendet '=' für Polsterung. Ihre String-Bit-Länge ist nicht durch 24 teilbar, daher wird sie mit '=' aufgefüllt. Übrigens sollte "=" URL-sicher sein, da es oft für Parameter in URLs verwendet wird.

Siehe auch this discussion.

+2

Wie Sie sagten "'=' .. [wird] oft für Parameter in URLs verwendet", ist es nicht URL-sicher im Abfrageparameterteil der URL - Der Punkt der URL-Sicherheit ist es, keine speziellen URL-Zeichen in der Zeichenfolge. – joar

2

Das '=' dient zum Auffüllen. Wenn Sie die Ausgabe als Wert eines URL-Parameters übergeben möchten, müssen Sie diesen zuerst zurückgeben, damit das Padding beim späteren Einlesen des Werts nicht verloren geht.

import urllib 
param_value = urllib.quote_plus(b64_data) 

Python folgt nur RFC3548, indem die ‚=‘ für Polsterung, auch wenn es scheint, als ob eine geeignetere Zeichen ersetzen sollte.

1

Ich würde erwarten, dass ein URI-Parser ein "=" im Wert Teil eines Parameters ignorieren würde.

Die URI-Parameter sind: "&", [name] "=" [Wert], als nächstes, so entspricht ein Zeichen im Wert Teil ist harmlos. Ein Unescaped-Ampersand hat mehr Potenzial, den Parser zu durchbrechen.