在这里使用什么是最合适的 JSON-serialisable 类型?
What is the most appropriate JSON-serialisable type to use here?
开发人员大家好,
我正在尝试在 repl.it 上编写一个小的概念验证程序,它使用 BCrypt 安全地存储凭据。为了避免自己对 SQL 感到厌烦,我正在使用内置 repl.it 数据库来存储凭据进行原型设计。
问题方法如下:
def SignUp(self):
'''Takes the username and password used to initialise the object, and stores them securely'''
username = self.__username_input
# Convert password input into bytes object
password_bytes = bytes(self.__password_input, "UTF-8")
# Hash password using the BCrypt algorithm
hashed_password = bcrypt.hashpw(password_bytes, bcrypt.gensalt(rounds=14))
username_available = True # True for testing - change to False for production
# Checks if the username is available
try:
db[username]
except KeyError:
username_available = True
if username_available:
# Store password in database
db[username] = hashed_password
self.Username = username
self.IsAuthenticated = True
print(db[username])
return True
else:
return False
目前,当我运行这个时,我得到以下错误:
TypeError: Object of type bytes is not JSON serializable
现在我已经尝试将 db[username] = hashed_password
更改为 db[username] = str(hashed_password)
,效果很好,但是当我像 bcrypt.checkpw(password_bytes, bytes(db[username], "UTF-8"))
这样从数据库中获取散列密码时,BCrypt 抛出此错误:
ValueError: Invalid salt
任何建议都会很棒。
谢谢!
问题似乎是 db
仅支持可序列化对象。
由于我不知道 db
是什么,在我过时的回答中,我假设您使用的是字典,但事实并非如此。
# Store the password by encoding the bytes
db[username] = hashed_password.decode()
# Check it decoding the string
bcrypt.checkpw(password_bytes, db[username].encode())
使用 str()
和 bytes()
与使用 .encode()
和 .decode()
的区别
password = '123123'
password_bytes = bytes(password, "UTF-8")
str_convert = str(password_bytes)
bytes_convert = bytes(str_convert, "UTF-8")
# str_convert = "b'123123'"
# bytes_convert = b"b'123123'"
decode = password_bytes.decode()
encode = decode.encode()
# decode = '123123'
# encode = b'123123'
即使您是第一次使用 password_bytes = bytes(password, "UTF-8")
并且它有效,我也不建议以这种方式将字符串转换为字节。最好用.encode()
开发人员大家好,
我正在尝试在 repl.it 上编写一个小的概念验证程序,它使用 BCrypt 安全地存储凭据。为了避免自己对 SQL 感到厌烦,我正在使用内置 repl.it 数据库来存储凭据进行原型设计。
问题方法如下:
def SignUp(self):
'''Takes the username and password used to initialise the object, and stores them securely'''
username = self.__username_input
# Convert password input into bytes object
password_bytes = bytes(self.__password_input, "UTF-8")
# Hash password using the BCrypt algorithm
hashed_password = bcrypt.hashpw(password_bytes, bcrypt.gensalt(rounds=14))
username_available = True # True for testing - change to False for production
# Checks if the username is available
try:
db[username]
except KeyError:
username_available = True
if username_available:
# Store password in database
db[username] = hashed_password
self.Username = username
self.IsAuthenticated = True
print(db[username])
return True
else:
return False
目前,当我运行这个时,我得到以下错误:
TypeError: Object of type bytes is not JSON serializable
现在我已经尝试将 db[username] = hashed_password
更改为 db[username] = str(hashed_password)
,效果很好,但是当我像 bcrypt.checkpw(password_bytes, bytes(db[username], "UTF-8"))
这样从数据库中获取散列密码时,BCrypt 抛出此错误:
ValueError: Invalid salt
任何建议都会很棒。
谢谢!
问题似乎是 db
仅支持可序列化对象。
由于我不知道 db
是什么,在我过时的回答中,我假设您使用的是字典,但事实并非如此。
# Store the password by encoding the bytes
db[username] = hashed_password.decode()
# Check it decoding the string
bcrypt.checkpw(password_bytes, db[username].encode())
使用 str()
和 bytes()
与使用 .encode()
和 .decode()
password = '123123'
password_bytes = bytes(password, "UTF-8")
str_convert = str(password_bytes)
bytes_convert = bytes(str_convert, "UTF-8")
# str_convert = "b'123123'"
# bytes_convert = b"b'123123'"
decode = password_bytes.decode()
encode = decode.encode()
# decode = '123123'
# encode = b'123123'
即使您是第一次使用 password_bytes = bytes(password, "UTF-8")
并且它有效,我也不建议以这种方式将字符串转换为字节。最好用.encode()