10

これはばかげた質問に違いないと思いますが、urlsafe_b64encode() の結果が常に「=」で終わるのはなぜですか? 「=」は安全な 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)

出力:

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

3 に答える 3

8

Base64はパディングに「=」を使用します。文字列のビット長は 24 で割り切れないため、「=」で埋められます。ところで、'=' は URL のパラメーターによく使用されるため、URL セーフである必要があります。

このディスカッションも参照してください。

于 2009-01-15T18:38:06.410 に答える
3

'='はパディング用です。出力をURLパラメータの値として渡したい場合は、最初にそれをエスケープして、後で値を読み込んだときにパディングが失われないようにする必要があります。

import urllib
param_value = urllib.quote_plus(b64_data)

Pythonは、パディングに「=」を使用できるようにすることでRFC3548に準拠していますが、より適切な文字で置き換える必要があるようです。

于 2009-01-15T18:58:48.227 に答える
1

URIパーサーはパラメーターの値部分の「=」を無視すると思います。

URIパラメータは次のとおりです: "&"、[name]、 "="、[value]、next、したがって、値の部分の等号は無害です。エスケープされていないアンパサンドは、パーサーを壊す可能性が高くなります。

于 2009-01-15T19:01:08.517 に答える