Python工具箱系列(十六)

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

常见的摘要算法有:

  • MD5
  • SHA1
  • SHA256
  • 其它

特点如下:

 

  • 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,一般认为,摘要的最终输出越长,该摘要算法就越安全。变长输入,定长输出。

  • 一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。

  • 消息摘要函数是单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息。

  • 优秀的摘要算法,没有人能从中找到“碰撞”,即无法找到两条不同的消息,使它们的摘要相同。

在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值很容易。

  • 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

  • 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

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

 

  • 2010年CMU软件工程机构认为MD5摘要算法已经在密码学上被破译并且不适合使用。

  • 2012年恶意软件利用了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的计算,并且与提供者发布的md5值进行比较,如果相同则可以放心使用。

  • 对目录下的不同名称的文件去重。相对于根据文件名称、大小与时间这些非常容易变化的不可靠信息来说,对文件进行md5计算去重是非常准确的。相同的md5可以确定(极小概率不正确)是相同的文件。假设一个图片文件,被多次复制更名成为不同的文件名,经过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计算,就不必顾及编码格式了。

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python工具箱系列(十六) - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Python工具箱系列(二十二)

    互联网世界里最流行的开源关系型数据库之一就是MySQL/MariaDB了,由于高度的相似,故而直接使用mysql统一指称。 windows下的安装 windows最吸引人的地方就在于易于安装。mysql在WINDOWS下也是最容易安装的。直接在官网上下载可安装程序,一路NEXT即可。 ubuntu18.04的安装 如果是生产环境部署,建议以普通用户角色,使用…

    Python开发 2023年3月31日
    00
  • Python工具箱系列(十七)

    很多软件工程师都认为MD5是一种加密算法,然而这种观点是不对的。作为一个 1992 年第一次被公开的算法,到今天为止已经被发现了一些致命的漏洞。本文讨论MD5在密码保存方面的一些问题。 假设下面一个场景:   软件产品让用户输入用户名与口令,随即使用MD5算法将口令(明文)转变成为摘要值。 用户登录时,用户输入的口令,也使用MD5进行计算,然后与存储的MD5…

    2023年4月2日
    00
  • Python工具箱系列(十九)

    有了非对称密钥、摘要、对称密钥等现代密码学算法与技术,是不是就能够保证通信的安全无虞呢,并不是。 密码学在互联网应用的四个目标:机密性、完整性、身份验证、防抵赖。到目前为止,我们讨论的技术中,其中防抵赖的目标并没有达到。 假设A、B、C三个人共享一个对称加密算法密钥,现在A和B互相通信,A和B一直认为是双方在发送消息。由于C也有同样的密钥,它可以拦截A发往B…

    Python开发 2023年4月2日
    00
  • Python工具箱系列(九)

    在计算机世界里,信息安全始终占据着重要的地位,我们随处就可以看到信息安全的应用: ◆ 访问网站时,使用https而不是http会使访问者的安全性大大提升 ◆ 下载文件时,正规的网站都会提供MD5或类似的散列码,供下载后校验,以防止下载被篡改的文件(有可能包含病毒或恶意代码等) ◆ 网络银行或者手机银行的U盾或者电子证书等 ◆ 区域链以及数字货币等 ◆ ssh…

    2023年4月2日
    00
  • Python工具箱系列(二十五)

    Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是一个nosql数据库。nosql是not-only sql的意思,泛指非关系型数据库。…

    Python开发 2023年3月31日
    00
  • Python工具箱系列(二十四)

    不管多少人黑微软,微软出品的大多数产品都能够深入人心,成为精品。在数据库领域,微软为专业人士提供SQL Server(简称mssql)。为日常办公人士提供Access与Excel这两款数据存储与分析的神器。 SQL Server是微软在数据库领域打造的旗舰产品,使用起来安全、稳定、可靠,并且对于SQL语言的语法与特性支持的非常好。长期以来由于微软敌视开源运动…

    2023年3月31日
    00
  • Python工具箱系列(二十)

    数据库操作应是所有合格程序员的基本功,写的一手好SQL对于数据分析师而言更是安身立命之本。大部分软件开发人员使用的数据库都是MySql/MariaDB,毕竟LAMP(linux+apache+mysql+php)曾经风靡一时。但开发人员真正的瑞士小军刀却是SQLite,它是世界上装机量第一的嵌入式数据库。 SQLite最初的构思是在一条军舰上进行的。当时在通…

    2023年4月2日
    00
  • Python工具箱系列(二十一)

    准备数据 为了方便准备试验用的数据,建议使用Faker这个库来模拟。Faker是一个Python软件包,可生成伪造数据。无论是需要引导数据库,创建美观的XML文档,填充持久性以进行压力测试,还是匿名化来自生产服务的数据,Faker都能完美实现。 pip install faker 以下代码生成姓名、性别这类最常用的试验数据。 from faker impor…

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部