day5-hashlib模块

Posted 里纳斯-派森

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day5-hashlib模块相关的知识,希望对你有一定的参考价值。

一、概述

在程序开发过程中,很多时候会涉及用户信息验证环节,这类场景下我们往往需要对字符串进行加密处理。python中也有专门的加密模块,它就是hashlib。下面章节将详述它的常见用法。

二、常见加密算法的使用

hashlib模块支持业界主流常见的一些加密算法,如md5,sha1,sha256,sha384,sha 512,hmac加密等,具体用法都差不多,只是调用的算法不同而已。需要注意的是,在输入需要被加密的字符串时,必须先encode等二进制串,所以在字符串前面要加上b。

2.1 md5加密

直接上代码把,没有太多可以讲述的了。

  1 import hashlib
  2 
  3 m = hashlib.md5()	#创建一个md5对象,即通过md5加密处理
  4 m.update(b‘python‘)  	#此处传递的字符串需要encode成二进制,前面加b
  5 print(m.hexdigest())	#以16进制输出
  6 
  7 输出:
  8 23eeeb4347bdd26bfc6b7ee9a3b755dd

注意:
这里的update有点类似于append的作用,当我们连续两次update后输出时,最后输出的md5码并非最后一次update的字符串对应的md5码,而是对此前所有update的字符串的拼接后计算出的md5码,当然前提是update前面的对象是同一个。

如何验证这个结论呢?代码奉上:

  1 import hashlib
  2 
  3 m = hashlib.md5()
  4 m.update(b‘py‘)
  5 print(m.hexdigest())
  6 m.update(b‘thon‘)
  7 print(m.hexdigest())
  8 print(‘-------‘)
  9 n = hashlib.md5()
 10 n.update(b‘python‘)#一次性update一个字符串
 11 print(n.hexdigest())
 12 print(‘========‘)
 13 o = hashlib.md5()
 14 o.update(b‘py‘+b‘thon‘)#自行拼接字符串输出
 15 print(o.hexdigest())
 16 
 17 输出:
 18 dfed5bc177b87ab317c584e06566adc6
 19 23eeeb4347bdd26bfc6b7ee9a3b755dd
 20 -------
 21 23eeeb4347bdd26bfc6b7ee9a3b755dd
 22 ========
 23 23eeeb4347bdd26bfc6b7ee9a3b755dd
从以上代码可以看出,对同一个md5对象多次update字符串,输出的md5码实际是对多个字符串拼接后的md5计算。这里也给我们一个启示,如果要计算一个文件的md5码,如果文件长度不会对机器的硬件资源造成压力,一次性读取内容后进行md5计算是最快捷的方式了。

2.2 sha1加密

如上文所述,其他算法的用法非常类似,只是调用的算法不同罢了。

  1 import hashlib
  2 
  3 m = hashlib.sha1()
  4 m.update(b‘sha1‘)
  5 print(m.hexdigest())
  6 
  7 
  8 输出:
  9 415ab40ae9b7cc4e66d6769cb2c08106e8293b48

2.3 sha256加密

如法炮制sha256算法

  1 import hashlib
  2 
  3 m = hashlib.sha256()
  4 m.update(b‘sha1‘)
  5 print(m.hexdigest())
  6 输出:
  7 b1565820a5cdac40e0520d23f9d0b1497f240ddc51d72eac6423d97d952d444f

2.4 sha512加密

看看sha512算法把。

  1 import hashlib
  2 
  3 m = hashlib.sha512()
  4 m.update(b‘sha1‘)
  5 print(m.hexdigest())
  6 
  7 输出:
  8 4af46fa0152c825afee230022f46e3aedb0a9ee2a3dc20e30821a4d263327074b26455f29578812876011dd921132c6ed813b38d16b1b2a1c1fa7cea1a6b1fd9

2.5 hmac加密

以上加密算法主要用于字符串的加密处理,还有一种用于身份验证可防窃听的加密算法,它就是hmac加密。散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制,是一种基于密钥的哈希算法的认证协议。

HMAC加密算法是一种基于密钥的报文完整性的验证方法,其安全性是建立在Hash加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。HMAC加密算法可以用来作加密、数字签名、报文验证等。

HMAC加密算法的定义

HMAC加密算法是一种执行“校验和”的算法,它通过对数据进行“求和”来检查数据是否被更改了。在发送数据以前,HMAC加密算法对数据块和双方约定的公钥进行“散列操作”,以生成称为“摘要”的东西,附加在待发送的数据块中。当数据和摘要到达其目的地时,就使用HMAC加密算法来生成另一个校验和,如果两个数字相匹配,那么数据未被做任何篡改。否则,就意味着数据在传输或存储过程中被某些居心叵测的人作了手脚。

实际的典型应用场景是挑战/响应”(Challenge/Response)身份认证,认证流程如下:

(1) 客户端向服务器发出一个验证请求。

(2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。

(3) 客户端将收到的随机数结合本地的密码,通过双方约定一致的算法进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。

(4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。

以上是理论背景知识,python中的用法如下:

  1 import hmac
  2 h = hmac.new(b‘hi‘, b‘python‘)  #这里的hi是双方随机生成的数据块,相当于额外加的料,python才是真正的核心数据
  3 print(h.hexdigest())
  4 
  5 输出:
  6 392e75a856ddb4f8203ef82f7f21b391

三、关于加密算法

以上讲述了python中典型的加密算法的使用。实际上加密算法和密码学的理论博大精深,在实际应用中还需要结合各种算法的特点来进行选择,在安全性和计算效率之间取得一个可满足需求的平衡点(如md5的算法安全性堪忧,sha512的输出明显比sha1要复杂得多,另外还有des、3des等算法等等)。

以上是关于day5-hashlib模块的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地将 C 代码片段编译到我的 Perl 模块?

CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段

如何将字符串数据从活动发送到片段?

argparse 代码片段只打印部分日志

nodejs常用代码片段

常用python日期日志获取内容循环的代码片段