Байтовая ошибка объекта при проверке зашифрованных паролей (Python)Python

Программы на Python
Anonymous
Байтовая ошибка объекта при проверке зашифрованных паролей (Python)

Сообщение Anonymous »

Я создаю приложение, требующее входа пользователя. Имя пользователя и пароль должны храниться в базе данных, но я не хочу хранить их в виде плоского текста. Я следовал этому руководству о том, как безопасно хранить пароли в базе данных. Я использую код из руководства, за исключением того, что я внес некоторые изменения, чтобы использовать pyodbc вместо их библиотеки SQL.
Чтобы создать имя пользователя и пароль, я использую этот код, который прекрасно работает и сообщения в БД:

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

import pyodbc
import os
import hashlib

PEPPER = "SECRET_KEY"

def create_user(username, password):

conn = pyodbc.connect(
r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + db_path + ";"
)

cursor = conn.cursor()

# Generate secure hash
password_hash = create_secure_password(password)

# Split hash into components
salt, key = password_hash[:16], password_hash[16:]
hash_algo = "sha256"
iterations = 100_000

# Insert into database
info = (username, key, salt, hash_algo, iterations)
cursor.execute("INSERT INTO Login_Info ([username], [password_hash], [salt], [hash_algo], [iterations] ) VALUES (?, ?, ?, ?, ?)", info)

conn.commit()
conn.close()

def create_secure_password(password):
salt = os.urandom(16)
iterations = 100_000
hash_value = hashlib.pbkdf2_hmac('sha256',password.encode('utf-8') + PEPPER.encode('utf-8'),  salt, iterations)
password_hash = salt + hash_value
return password_hash
Запись в базе данных выглядит следующим образом:
Имя пользователя и пароль в базе данных
Однако, когда я использую этот метод для проверки имя пользователя и пароль для базы данных, я получаю эту ошибку:

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

TypeError: a bytes-like object is required, not 'str'
Ошибка связана с этой строкой кода, которая, как я полагаю, преобразует введенный пароль в хэш для сравнения с хешем базы данных

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

password_hash = hashlib.pbkdf2_hmac(hash_algo, password.encode('utf-8'), salt, iterations)
Полный код метода входа в систему выглядит следующим образом:

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

def login(username, password):
#connect to DB
conn = pyodbc.connect(
r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + db_path + ";"
)

cursor = conn.cursor()

# Define your SQL query
select_sql = "SELECT * FROM Login_Info WHERE username = ?"

# Execute the query using the cursor
cursor.execute(select_sql, (username,))

# Fetch one row of result
account = cursor.fetchone()

if not account:
print("Invalid username")
return

salt, db_key, hash_algo, iterations = account[2:6]

# Recompute hash from user entered password
password_hash = hashlib.pbkdf2_hmac(hash_algo, password.encode('utf-8'), salt, iterations)

# Compare hashes
if password_hash == db_key:
print("Login successful")
else:
print("Invalid password")
Я пытался найти в Интернете другие ресурсы, но не смог найти никого с такой же проблемой.

Подробнее здесь: https://stackoverflow.com/questions/790 ... rds-python

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