Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'bytes' object has no attribute 'encode'

I'm trying to store salt and hashed password before inserting each document into a collection. But on encoding the salt and password, it shows the following error:

 line 26, in before_insert
 document['salt'] = bcrypt.gensalt().encode('utf-8')

AttributeError: 'bytes' object has no attribute 'encode'

This is my code:

def before_insert(documents):
    for document in documents:
        document['salt'] = bcrypt.gensalt().encode('utf-8')
        password = document['password'].encode('utf-8')
        document['password'] = bcrypt.hashpw(password, document['salt'])

I'm using eve framework in virtualenv with python 3.4

like image 321
DEVV911 Avatar asked Jul 07 '16 13:07

DEVV911


2 Answers

You're using :

bcrypt.gensalt()
This method seems to generate a bytes object. These objects do not have any encode methods as they only work with ASCII compatible data. So you can try without .encode('utf-8')

Bytes description in python 3 documentation

like image 84
Kreu Avatar answered Oct 29 '22 23:10

Kreu


The salt from the .getsalt() method is a bytes object, and all the "salt" parameters in the methods of bcrypt module expect it in this particular form. There is no need to convert it to something else.

In contrast to it, the "password" parameters in methods of bcrypt module are expected it in the form of the Unicode string - in Python 3 it is simply a string.

So - assuming that your original document['password'] is a string, your code should be

def before_insert(documents):
    for document in documents:
        document['salt'] = bcrypt.gensalt()
        password = document['password']
        document['password'] = bcrypt.hashpw(password, document['salt'])
like image 34
MarianD Avatar answered Oct 29 '22 23:10

MarianD