md5加密来自str的密码(输入)

时间:2014-05-05 10:55:23

标签: python encryption login passwords md5

我试图从文件中哈希密码,然后将其与用户提供的密码进行匹配。它不是安全的超级安全,所以密码不是文件中的纯文本。 我收到了错误

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()}

2 个答案:

答案 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对输入进行哈希处理以进行比较。