2014-10-13 3 views
0

я работаю на 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), это приводит к этой ошибке.

ответ

1

Я думаю, что вы смешиваете urlsafe_b64encode и decodestring. Проверьте documentation.

Вы должны либо использовать urlsafe_b64encode и urlsafe_b64decode или b64encode и b64decode

def hash_password(pw): 
    #Create salt 
    salt = base64.b64encode(os.urandom(8)) 
    salted = base64.b64encode(base64.b64decode(salt) + pw) 
    hashed = hashlib.md5(salted).digest() 
    return base64.b64encode(hashed) 

EDIT

binascii сделал трюк, работает со следующим кодом:

def hash_password(pw): 
    #Create salt 
    salt = base64.b64encode(os.urandom(8)) 
    salted = base64.b64encode(binascii.a2b_base64(salt) + pw) 
    hashed = hashlib.md5(salted).digest() 
    return base64.b64encode(hashed) 
+0

Я действительно извините, это была моя ошибка. Я уже использовал urlsafe_b64decode раньше, но я возился с разными методами, пытаясь заставить его работать, и случайно я скопировал неправильную версию по моему вопросу. Уже редактировал. – ivanvlopes

+0

Есть ли причина, по которой вы используете функции urlsafe? – wenzul

+0

У меня нет сервера GAE, чтобы проверить это. Но вы действительно уверены, что используете последнюю версию своего скрипта? соль - строка ascii, потому что ее b64encoded. Но я думаю, вы тоже смотрите на это ... :) – wenzul

Смежные вопросы