jekeyhui99 发表于 2019-1-25 11:56:53

通过python的hashlib模块计算一个文件的MD5值

<p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: &quot;Helvetica Neue&quot;, Helvetica, Verdana, Arial, sans-serif; font-size: 12px;">Python的hashlib提供了很多摘要算法,如MD5,SHA1等常用算法。</p><p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: &quot;Helvetica Neue&quot;, Helvetica, Verdana, Arial, sans-serif; font-size: 12px;">&nbsp; 什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(如MD5值共32位,且每位都是用16进制进行表示)。</p><p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: &quot;Helvetica Neue&quot;, Helvetica, Verdana, Arial, sans-serif; font-size: 12px;">&nbsp; 摘要算法就是通过摘要函数对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。</p><p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: &quot;Helvetica Neue&quot;, Helvetica, Verdana, Arial, sans-serif; font-size: 12px;">&nbsp; 摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算digest很容易,但通过digest反推数据data却非常困难,并且对原始数据做出任意的修改都会导致计算出的digest完全不同。</p><p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: &quot;Helvetica Neue&quot;, Helvetica, Verdana, Arial, sans-serif; font-size: 12px;">&nbsp; 综上所述,只要是一个完整且未被修改过的文件,它的MD5值或者其他算法值都是固定不变的,一旦计算出数值与原作者给出的数值不同,就要当心此文件的安全性了。</p><p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: &quot;Helvetica Neue&quot;, Helvetica, Verdana, Arial, sans-serif; font-size: 12px;">那么,利用python怎么计算一个文件的MD5值呢?以下是简写代码:</p><div class="cnblogs_code" style="margin-top: 5px; margin-bottom: 5px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; color: rgb(0, 0, 0); font-size: 12px; font-family: &quot;Courier New&quot; !important;"><div class="cnblogs_code_toolbar" style="margin-top: 5px;"><span class="cnblogs_code_copy" style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: rgb(0, 0, 0); text-decoration-line: underline; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 660px; height: auto;"></a></span></div><pre style="white-space: pre-wrap; font-family: &quot;Courier New&quot; !important;"><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 1</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span> hashlib                                 <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">#</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">导入hashlib模块</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 2</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">def</span> match(file_path,Bytes=1024<span style="line-height: 1.5 !important;">):
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 3</span>   md5_1 = hashlib.md5()                        <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">#</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">创建一个md5算法对象</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 4</span>   with open(file_path,<span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">rb</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span>) as f:            <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">#</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">打开一个文件,必须是'rb'模式打开</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 5</span>         <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">while</span> 1<span style="line-height: 1.5 !important;">:
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 6</span>             data =f.read(Bytes)                  <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">#</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">由于是一个文件,每次只读取固定字节</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 7</span>             <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">if</span> data:                          <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">#</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">当读取内容不为空时对读取内容进行update</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 8</span> <span style="line-height: 1.5 !important;">                md5_1.update(data)
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 9</span>             <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">else</span>:                             <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">#</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">当整个文件读完之后停止update</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">10</span>               <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">break</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">11</span>   ret = md5_1.hexdigest()                 <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">#</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">获取这个文件的MD5值</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">12</span>   <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> ret
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">13</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">14</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">15</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">print</span>(match(r<span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">E:\红军不怕远征难\我与小姐姐的同居生活.avi</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span>))</pre></div><p></p>
页: [1]
查看完整版本: 通过python的hashlib模块计算一个文件的MD5值