我试图从文件中哈希密码,然后将其与用户提供的密码进行匹配。它不是安全的超级安全,所以密码不是文件中的纯文本。 我收到了错误
TypeError: Unicode-objects must be encoded before hashing
如果我输入hashpass = hashlib.md5(b' p'),它会起作用.hexdigest() 但它只会加密" p"
如何让它加密我的字符串输入?
PROGRAM
import hashlib
status = ""
def passhash():
code = open("password.txt", "r")
password = code.readline()
global encrypt
encrypt = hashlib.md5(password).hexdigest()
def checkPassword():
for key in range(3):
p = input("Enter the password >>")
hashpass = hashlib.md5(p).hexdigest()
if hashpass == encrypt:
print("password correct!")
status = "q"
return status
else:
print ('wrong password, try again')
print ('you have failed')
def Main():
status = input("p for program, q to quit: ")
if status == "p":
passhash()
checkPassword()
elif status == "q":
print("Byebye")
status = "q"
return status
while status != "q":
status = Main()}
答案 0 :(得分:3)
在散列之前对Unicode字符串进行编码和/或以二进制模式打开文件。选择一个编码并坚持下去; UTF-8支持所有Unicode:
p = input("Enter the password >>")
hashpass = hashlib.md5(p.encode('utf8')).hexdigest()
您必须在passhash()
中执行相同操作或以二进制模式打开文件,并假设该文件使用相同的编码。
答案 1 :(得分:1)
表达式b'p'
将字符串文字'p'
编码为字节,而不是p
变量的值。试试p.encode('utf-8')
。
顺便说一句,你所做的事情毫无意义。由于您正在存储明文并从用户收集明文输入,因此在比较它们之前对它们进行散列不会增加任何安全性。
解决此问题的正确方法是存储密码哈希(从不存储明文)并对输入进行哈希处理以进行比较。更好的是用随机盐哈希密码;存储盐和哈希密码;并使用salt对输入进行哈希处理以进行比较。