【问题标题】:md5 encrypting passwords from str(input) [duplicate]来自字符串(输入)的 md5 加密密码 [重复]
【发布时间】:2023-11-23 14:36:01
【问题描述】:

我试图从文件中散列密码,然后将其与用户提供的密码匹配。并不是说超级安全只是足够安全,这样密码就不是文件中的纯文本。 我得到错误

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

【问题讨论】:

  • 嗯,您是否按照错误消息的提示进行操作并尝试encoding password
  • 您不想将 md5 用于任何密码散列,它不是为它设计的。相反,您想查看 passlib module,或在 unix 平台上使用 crypt module。它们的使用并不比您幼稚的方法复杂。

标签: python encryption login passwords md5


【解决方案1】:

在散列之前编码您的 Unicode 字符串和/或以二进制模式打开文件。选择一种编码并坚持下去; UTF-8 支持所有的 Unicode:

p = input("Enter the password >>")      
hashpass = hashlib.md5(p.encode('utf8')).hexdigest()

您要么必须在passhash() 中执行相同的操作,要么以二进制模式打开文件并假设文件使用相同的编码。

【讨论】:

  • 谢谢,这正是我想要的
【解决方案2】:

表达式b'p' 将字符串文字'p' 编码为字节,而不是p 变量的值。试试p.encode('utf-8')

顺便说一句,你所做的毫无意义。由于您要存储纯文本并从用户那里收集纯文本输入,因此在比较它们之前对两者进行哈希处理不会增加任何安全性。

解决此问题的正确方法是存储密码哈希(从不存储明文)并对输入进行哈希处理以进行比较。最好用随机盐对密码进行哈希处理;存储盐和哈希密码;并用盐对输入进行哈希处理以进行比较。

【讨论】:

  • 是的,我同意,现在当我的程序接收到密码时,它会对其进行哈希处理,然后只处理哈希形式的密码
  • 这是负责任的做法,对你有好处
最近更新 更多