Python Postgres извлекает как байтовый объект против strPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python Postgres извлекает как байтовый объект против str

Сообщение Anonymous »

Я создаю базовое приложение Python Flask с базой данных Postgres, используя psycopg2. У меня возникли проблемы с настройкой хэша пароля регистрации пользователя, поскольку кажется, что я работаю со строковым или байтовым типом. По сути, я получаю эту ошибку при повторном хешировании пароля при входе в систему (после регистрации и первоначального хэша)

Код: Выделить всё

hash_value = hashlib.pbkdf2_hmac(

# TypeError: a bytes-like object is required, not 'str'
Вот соответствующая настройка таблицы:

Код: Выделить всё

CREATE TABLE IF NOT EXISTS myschema.mytable
(
--Unrelated fields...
password_hash character varying(500) COLLATE pg_catalog."default" NOT NULL,
salt character varying(100) COLLATE pg_catalog."default" NOT NULL,
--More unrelated fields...
)
Вот как я вставляю данные:

Код: Выделить всё

# Code above that is setting up a DB utility, configs, etc...
# Hash the password
salt = os.urandom(16)
iterations = 100000
hash_value = hashlib.pbkdf2_hmac(
'sha256',
password.encode('utf-8') + app_config['PEPPER'].encode('utf-8'),
salt,
iterations
)

password_hash = salt + hash_value

# Redacted extra fields
query = "INSERT INTO mytable (password_hash, salt) VALUES (%s, %s);"
params = (password_hash, salt)

# This kicks off the standard cursor execute, etc...
db.query(query, params)
И для поиска:

Код: Выделить всё

# Code above that is setting up a DB utility, configs, etc...
query = "SELECT password_hash, salt FROM mytable WHERE email = %s;"
params = (email,)

users = db.query(query, params)
db.close()

# No user found
if not users:
return False

db_password_hash, db_salt = users[0]

iterations = 100000
hash_value = hashlib.pbkdf2_hmac( # This will be the spot that throws the exception as it expects bytes for
'sha256',
password.encode('utf-8') + app_config['PEPPER'].encode('utf-8'),
db_salt,
iterations
)

# Then commence validation logic, etc...
Я пробовал использовать bytes(db_salt, 'utf-8'), поскольку он действительно выдает ошибку в поле соли. Однако это не приведет к успешному перефразированию. Я прислушаюсь к рекомендациям – это новая разработка, поэтому, если мне нужно создать двоичный тип postgres, я тоже могу это сделать – здесь имеет смысл любой вариант.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/793 ... ect-vs-str
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»