从str(input)加密密码为md5

1 投票
2 回答
9054 浏览
提问于 2025-04-18 05:24

我正在尝试从一个文件中对密码进行哈希处理,然后将其与用户输入的密码进行匹配。这个过程不需要特别安全,只要确保密码在文件中不是明文就可以了。

我遇到了一个错误:

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()中做同样的事情,要么以二进制模式打开文件,并假设这个文件使用的是相同的编码。

撰写回答