Python 3.2中的Python MD5哈希比较

2024-10-01 17:22:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图验证从服务器下载的两个文件。第一个文件包含数据,第二个文件包含MD5哈希校验和。在

我创建了一个函数,它从数据文件中返回一个hexdigest,如下所示:

def md5(fileName):
    """Compute md5 hash of the specified file"""
    try:
        fileHandle = open(fileName, "rb")
    except IOError:
        print ("Unable to open the file in readmode: [0]", fileName)
        return
    m5Hash = hashlib.md5()
    while True:
        data = fileHandle.read(8192)
        if not data:
            break
        m5Hash.update(data)
    fileHandle.close()
    return m5Hash.hexdigest()

我使用以下方法比较文件:

^{pr2}$

文件比较失败,因此我打印出fileHashfileHandleData,得到以下结果:

[0] b'MD5 (hashFile.tbz) = b60d684ab4a2570253961c2c2ad7b14c\n'
[0] b60d684ab4a2570253961c2c2ad7b14c

从上面的输出来看,哈希值是相同的。为什么哈希比较失败?我是python新手,正在使用python3.2。有什么建议吗?在

谢谢。在


Tags: 文件the数据服务器datareturnopenfilename
3条回答

您正在将哈希值与fileHandle的内容进行比较。您需要删除MD5 (hashFile.tbz) =部分以及尾随的换行符,因此请尝试:

if fileHash == fileHandleData.rsplit(' ', 1)[-1].rstrip():
    print ("Good")
else:
    print ("Bad")

请记住,在python3中,rsplit()和{}不支持缓冲区API,只对字符串进行操作。因此,正如Fred Nurk正确添加的那样,您还需要对fileHandleData/fileHash(分别是字节缓冲区或(Unicode)字符串)进行编码/解码。在

哈希值是相同的,但字符串不是。您需要获得摘要的十六进制值,并且需要解析文件中的哈希值。一旦你做了这些,你可以比较他们的平等。在

比较失败的原因相同这是错误的:

a = "data"
b = b"blah (blah) - data"
print(a == b)

该.md5文件的格式很奇怪,但如果它总是采用该格式,则一种简单的测试方法是:

^{pr2}$

因为fileHash是一个(Unicode)字符串,所以必须将其编码为字节进行比较。您可能希望指定编码,而不是使用当前的默认字符串编码。在

如果总是需要这种确切的格式,那么使用regex来提取哈希值并可能检查文件名会更健壮。在

或者,更灵活地说,您可以测试子字符串的存在性:

if fileHash.encode() in fileHandleData:

相关问题 更多 >

    热门问题