使用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