从str(input)加密密码为md5
我正在尝试从一个文件中对密码进行哈希处理,然后将其与用户输入的密码进行匹配。这个过程不需要特别安全,只要确保密码在文件中不是明文就可以了。
我遇到了一个错误:
TypeError: Unicode-objects must be encoded before hashing
如果我输入 hashpass = hashlib.md5(b'p').hexdigest(),它是可以工作的,但这样只加密了“p”这个字符。
我该如何让它加密我输入的字符串呢?
程序:
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()}
2 个回答
1
表达式 b'p'
是把字符串 'p'
转换成字节形式,而不是变量 p
的值。你可以试试 p.encode('utf-8')
。
顺便说一下,你现在做的事情是没什么意义的。因为你存的是明文(也就是用户输入的原始内容),在比较之前对这两者进行哈希处理并不会增加安全性。
正确的做法是存储密码的哈希值(绝对不要存明文),并对用户输入进行哈希处理来进行比较。更好的方法是用随机的盐值来哈希密码;存储盐值和哈希后的密码;然后用盐值对输入进行哈希处理来进行比较。
6
在对你的Unicode字符串进行哈希处理之前,先对它进行编码,或者以二进制模式打开文件。选择一种编码方式并坚持使用它;UTF-8可以支持所有的Unicode字符:
p = input("Enter the password >>")
hashpass = hashlib.md5(p.encode('utf8')).hexdigest()
你要么在passhash()
中做同样的事情,要么以二进制模式打开文件,并假设这个文件使用的是相同的编码。