я работаю на Google App Engine
приложения, и мне нужно хэш пароля и соли его, и для этого я использую метод ниже:Python - Декодирование base64 кодированные строки с не-ASCII символов
def hash_password(password):
#Create salt
salt = base64.urlsafe_b64encode(os.urandom(8))
salted = base64.b64encode(base64.urlsafe_b64decode(salt) + password)
hashed = hashlib.md5(salted).digest()
return base64.b64encode(hashed)
Проблема заключается в попытке декодирования соли от base64
, так как соль, сгенерированная через urandom, имеет non-ascii
символов. Это приводит на ошибку:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd8 in position 2: ordinal not in range(128)
Я не могу пропустить этап декодирования соли на base64
, так как у меня уже есть хранилищу с паролями и соли генерироваться таким образом, что была заселена с помощью кода Java.
Как сохранить эту структуру и получить действительный хэшированный пароль, который я могу использовать для сравнения с хешированными паролями уже в моем хранилище данных?
Когда я выполняю тот же самый метод на моем терминале, используя интерпретатор python, он запускается без каких-либо проблем, однако при запуске его на сервере dev на сервере GAE (локально, используя тот же интерпретатор python), это приводит к этой ошибке.
Я действительно извините, это была моя ошибка. Я уже использовал urlsafe_b64decode раньше, но я возился с разными методами, пытаясь заставить его работать, и случайно я скопировал неправильную версию по моему вопросу. Уже редактировал. – ivanvlopes
Есть ли причина, по которой вы используете функции urlsafe? – wenzul
У меня нет сервера GAE, чтобы проверить это. Но вы действительно уверены, что используете последнюю версию своего скрипта? соль - строка ascii, потому что ее b64encoded. Но я думаю, вы тоже смотрите на это ... :) – wenzul