前面介绍了对称加密算法,本文将介绍密码学中另一类重要应用:消息摘要(Digest),什么是消息摘要?简单的定义是:对一份数据,进行一个单向的Hash函数,生成一个固定长度的Hash值,这个值就是这份数据的摘要,也称为指纹。

常见的摘要算法有:

特点如下:

在python3中,关于hash加密算法都放在hashlib这个标准库中,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。md5算法以前单列,而在python3的标准库中,也放在hashlib库中。在不同的平台上hashlib的能力不同,使用以下代码进行检测。

import hashlib
def capacity():
    print(hashlib.algorithms_guaranteed)
    print(hashlib.algorithms_available)
capacity()

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又称摘要算法、哈希算法)。

MD5算法具有以下特点:

MD5算法虽然应用广泛,但是它也有重大缺陷。

虽然md5存在重大问题,但在普通环境下,md5并非完全不可用,从时间、成本以及要处理对象综合考虑,仍然可以用md5做一些基本的工作。下面演示md5算法库的使用演示。

import hashlib
def md5_demo(inputstr,codingname):
    return hashlib.md5(inputstr.encode(encoding=codingname)).hexdigest()
codingnamelist = ['UTF-8','GBK','GB2312','GB18030']
data = ['欢迎关注陕西华路','stay hungry stay foolish']
for item in data:
    print(item)
    for cdn in codingnamelist:
        print(md5_demo(item,cdn))
    print()

这段代码演示了中文与英文字符串,在使用不同编码方式下生成的不同的md5值。对于中文而言,不同的编码会导致不同的输出。

欢迎关注陕西华路
5da5f58a3f902c739c3860b28afed47c
de60ee00e3144efbd37c38f1f6579fa8
de60ee00e3144efbd37c38f1f6579fa8
de60ee00e3144efbd37c38f1f6579fa8

可以看出,使用UTF-8编码会与其它编码产生不同的MD5值。而对于英文来说,则没有区别。

stay hungry stay foolish
d0653ce06bdc9fad39d9ac2312eb8b34
d0653ce06bdc9fad39d9ac2312eb8b34
d0653ce06bdc9fad39d9ac2312eb8b34
d0653ce06bdc9fad39d9ac2312eb8b34

md5算法除了对字符串外,对于任何字节流对象都可以使用,尤其对文件的处理更是极为有用,例如:

对文件的md5计算也非常简单,以下代码简单的演示了主要代码片断。

    @property
    def md5(self) -> str:
        """
        对文件做MD5操作,并且返回对应的MD5值
        Returns:
            str: md5
        """
        with self._filename.open('rb') as fr:
            return hashlib.md5(fr.read()).hexdigest()

使用默认的方式对所有文件进行相同的md5计算,就不必顾及编码格式了。

发表回复