Python工具箱系列(十六)

2025-12-13 0 731

前面介绍了对称加密算法,本文将介绍密码学中另一类重要应用:消息摘要(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计算,就不必顾及编码格式了。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 Python工具箱系列(十六) https://www.zuozi.net/36256.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务