对于我为自己设计的编程练习,以及稍后在非常安全的系统中使用的编程练习,我试图比较MD5哈希。存储在纯文本文件中并由check_pw()
函数提取的文件和从CGI表单提交的密码创建的文件。 md5_pw(
)用于创建程序中的所有哈希值。
出于某种原因,如果(pair[1] == md5_pw(pw))
总是失败,即使我的程序在错误检查行中打印出相同的哈希值:
print "this is the pw from the file: ", pair[1], "<br />" print "this is the md5 pw you entered: ", md5_pw(pw), "<br />"
我搞砸了哪里?
代码:
def md5_pw(pw):
"""Returns the MD5 hex digest of the pw with addition."""
m = md5.new()
m.update("4hJ2Yq7qdHd9sdjFASh9"+pw)
return m.hexdigest()
def check_pw(user, pw, pwfile):
"""Returns True if the username and password match, False otherwise. pwfile is a xxx.txt format."""
f = open(pwfile)
for line in f:
pair = line.split(":")
print "this is the pw from the file: ", pair[1], "<br />"
print "this is the md5 pw you entered: ", md5_pw(pw), "<br />"
if (pair[0] == user):
print "user matched <br />"
if (pair[1] == md5_pw(pw)):
f.close()
return True
else:
f.close()
print "passmatch a failure"
return False
答案 0 :(得分:2)
您的pair[1]
可能有一个尾随换行符。尝试:
for line in f:
line = line.rstrip()
pair = line.split(":")
# ...etc
答案 1 :(得分:1)
我的猜测是文件加载/解析存在问题,很可能是由换行符引起的。通过削减你的代码,我能够发现你的逻辑是合理的:
def md5_pw(pw):
m = md5.new()
m.update("4hJ2Yq7qdHd9sdjFASh9"+pw)
return m.hexdigest()
def check_pw(pw):
pair = ("c317db7d54073ef5d345d6dd8b2c51e6")
if (pair == md5_pw(pw)):
return True
else:
return False
>>> import md5
>>> check_pw('fakepw')
False
>>> check_pw('testpw')
True
(“c317db7d54073ef5d345d6dd8b2c51e6”是“4hJ2Yq7qdHd9sdjFASh9testpw”的md5哈希值)