使用Python进行MD5哈希编码?


所有IT公司都非常关注数据安全。有多种哈希技术可以保护和检查我们的数据。

什么是哈希?

哈希是一种函数,它以可变长度的字节序列作为输入,并将其转换为固定长度的序列。但是,要恢复原始数据(输入字节)并不容易。例如,x是你的输入,f是哈希函数,那么计算f(x)又快又容易,但是再次获得x则是一个非常耗时的工作。

哈希函数的返回值称为哈希值、校验和、哈希值或消息摘要。

我们可以总结如下:

假设你想将“Hello World”消息转换为md5哈希函数,则结果为:

在现实生活中,哈希函数广泛用于密码算法、数字签名、指纹、密码存储以及许多其他领域。作为Python程序员,我们需要哈希函数来检查数据或文件的重复性,在通过公共网络传输数据时检查数据完整性,在数据库中存储密码等等。

两种最常用的哈希函数或算法是:

  • MD5 - MD5或消息摘要算法将产生一个128位的哈希值。md5算法存在一些安全问题,这就是为什么我们主要使用它来检查数据完整性的原因。

  • SHA - SHA算法组下有多种算法,由美国联邦信息处理标准开发。这些算法比md5安全得多,因此广泛应用于包括密码应用在内的多个领域。这些算法生成的消息长度从160位到512位不等。

MD5

Python标准库包含一个名为hashlib的模块,其中包含大多数流行的哈希算法。大多数算法都在hashlib模块中实现,但是,如果你安装了OpenSSL,hashlib也可以用于处理这些算法。

首先,如果你想使用任何哈希算法,请导入hashlib模块:

import hashlib

现在,检查hashlib模块中当前可用的所需算法或所有算法:

>>> print(hashlib.algorithms_available)
{'sha3_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'dsaEncryption', 'dsaWithSHA', 'DSA', 'md5', 'sha384', 'sha224', 'sha3_384', 'ecdsa-with-SHA1', 'DSA-SHA', 'SHA1', 'md4', 'SHA256', 'MD4', 'sha3_512', 'whirlpool', 'sha256', 'shake_256', 'SHA', 'RIPEMD160', 'shake_128', 'SHA512', 'ripemd160', 'SHA224', 'sha', 'blake2s', 'SHA384', 'MD5'}

通过hashlib模块提供的上述算法列表包括通过OpenSSL的算法。

但是,要检查始终可用的算法列表,我们可以通过algorithms_guaranteed来检查。

>>> print(hashlib.algorithms_guaranteed)
{'sha3_512', 'sha256', 'sha3_256', 'shake_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'md5', 'shake_128', 'sha384', 'sha224', 'sha3_384', 'blake2s'}

让我们使用md5算法创建一个简单的程序:

代码

在线演示

import hashlib
hash_obj = hashlib.md5(b'Hello, Python!')
print(hash_obj.hexdigest())

输出

a0af7810eb5fcb84c730f851361de06a

上面的代码将“Hello, Python!”字符串作为输入,并打印该字符串的十六进制摘要。hexdigest返回表示哈希值的十六进制字符串。

但是,如果你想要返回的字节序列,则应该使用hash_obj.digest(),例如:

在线演示

import hashlib
hash_obj = hashlib.md5(b'Hello, Python!')
#To generate, sequence of bytes
print(hash_obj.digest())

输出

b'\xa0\xafx\x10\xeb_\xcb\x84\xc70\xf8Q6\x1d\xe0j'

如果你注意到,我们在任何字符串文字之前都使用了“b”,这是为了从字符串生成字节,因为哈希函数只接受字节序列作为参数。

如果你想从控制台传递字符串,不要忘记将字符串编码为字节序列:

在线演示

import hashlib
mystring = input('Enter string to hash: ')
hash_obj = hashlib.md5(mystring.encode())
print(hash_obj.hexdigest())

输出

Enter string to hash: Hello, TutorialsPoint
9a5d3fad65690dcf44adaec67226abe7

更新于:2020年6月30日

4K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告