Декодирование Django urlsafe base64 с дешифрованием

Я пишу свою собственную систему капчи для регистрации пользователя. Таким образом, я должен создать подходящий URL для получения сгенерированных изображений капчи. Поколение похоже на это:

_cipher = cipher.new(settings.CAPTCHA_SECRET_KEY, cipher.MODE_ECB)
_encrypt_block = lambda block: _cipher.encrypt(block + ' ' * (_cipher.block_size - len(block) % _cipher.block_size)) 
#...
a = (self.rightnum, self.animal_type[1])
serialized = pickle.dumps(a)
encrypted = _encrypt_block(serialized)
safe_url = urlsafe_b64encode(encrypted)

Но тогда я пытаюсь получить этот ключ через, ПОЛУЧАЮТ запрос в функции представления, это перестало работать на urlsafe_b64decode () с "символьным отображением, должен возвратить целое число, Ни один или unicode" ошибка:

def captcha(request):
  try:
    key = request.REQUEST['key']
    decoded = urlsafe_b64decode(key)
    decrypted = _decrypt_block(decoded)
    deserialized = pickle.loads(decrypted)
    return HttpResponse(deserialized)
  except KeyError: 
    return HttpResponseBadRequest()

Я нашел, что на выводе urlsafe_b64encode существует ул., но ДОБЕРИТЕСЬ, запрос возвращает объект unicode (тем не менее, это - правильная строка). Ул. () не помогла (она возвращается, декодируют ошибку глубоко внутри django), и если я использую key.repr, она работает, но decryptor не работает с ошибкой "Входные строки, должен быть кратным 16 в длине". В тестовом файле все это строительные работы отлично, я не могу понять, что случилось?

18
задан Enchantner 9 February 2010 в 14:39
поделиться

2 ответа

Проблема в том, что b64decode явно может принимать только байты (строку), а не Unicode.

>>> import base64
>>> test = "Hi, I'm a string"
>>> enc = base64.urlsafe_b64encode(test)
>>> enc
'SGksIEknbSBhIHN0cmluZw=='
>>> uenc = unicode(enc)
>>> base64.urlsafe_b64decode(enc)
"Hi, I'm a string"
>>> base64.urlsafe_b64decode(uenc)
Traceback (most recent call last):
...
TypeError: character mapping must return integer, None or unicode

Поскольку вы знаете, что ваши данные содержат только данные ASCII (именно это будет возвращать base64encode), можно безопасно кодировать ваши кодовые точки Unicode как байты ASCII или UTF-8, эти байты будут эквивалентны ожидаемому ASCII.

>>> base64.urlsafe_b64decode(uenc.encode("ascii"))
"Hi, I'm a string"
36
ответ дан 30 November 2019 в 07:12
поделиться

Я решил проблему!

deserialized = pickle.loads(captcha_decrypt(urlsafe_b64decode(key.encode('ascii'))))
return HttpResponse(str(deserialized))

Но до сих пор не понимаю, почему с первого раза не сработало.

3
ответ дан 30 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: