python常用模块-hashlib模块、hmac模块
hashlib模块
是一个提供字符加密功能的模块,包含MD5和SHA的加密算法,具体支持md5,sha1, sha224, sha256, sha384, sha512等算法。
-
.update(msg)
参数 msg 必须要是字节型,一般有以下两种处理方式-
msg = '代码小工蚁'.encode('utf-8')
-
msg = bytes('代码小工蚁', encoding='utf-8')
-
-
.digest()
返回二进制数据字符串值 -
.hexdigest()
返回十六进制数据字符串值
import hashlib # hashlib.algorithms_available 或 hashlib.algorithms_guaranteed来获取本模块支持的散列算法集合。 >>> hashlib.algorithms_available {'MD5', 'sha1', 'ecdsa-with-SHA1', 'SHA', 'md5', 'DSA', 'dsaWithSHA', 'SHA1', 'sha512', 'RIPEMD160', 'sha256', 'ripemd160', 'whirlpool', 'sha384', 'SHA256', 'sha', 'SHA384', 'sha224', 'MD4', 'DSA-SHA', 'SHA512', 'dsaEncryption', 'SHA224', 'md4'} >>> hashlib.algorithms_guaranteed {'sha384', 'sha1', 'sha224', 'md5', 'sha512', 'sha256'} # 基本调用 new_md5 = hashlib.md5() # 建立加密对象 new_md5.update('字符串'.encode('utf-8')) # 对字符串进行算法加密 print(new_md5.hexdigest()) # 获得16进制显示 ------------------------------------------------- # 可以创建的加密算法有md5,sha1, sha224, sha256, sha384, sha512 new_md5 = hashlib.md5() new_sha1 = hashlib.sha1() new_sha224 = hashlib.sha224() new_sha256 = hashlib.sha256() new_sha384 = hashlib.sha384() new_sha512 = hashlib.sha512() # 简单调用:一行代码搞定 >>> new_md5 = hashlib.new('md5','字符串'.encode()).hexdigest() # 方法一 >>> new_md5 'cc4dd1da7e1a754534215f02fb9ba85d' >>> new_sha1 = hashlib.new('sha1', '字符串'.encode()).digest() >>> new_sha1 b'M\xc9b\x1a\x04\x08q,\xd7\xdc\xe3\x01%o\x90\nw\x92\x0f^' >>> new_sha256 = hashlib.sha256('字符串'.encode()).hexdigest() # 方法二 >>> new_sha256 '6aaf0b1804f99cc58921b8209f14da4e3af6198a2c02e027ec36b92aac79753e' # 函数调用 def get_md5(s): md5_obj = hashlib.md5() md5_obj.update(s.encode('utf-8')) ret = md5_obj.hexdigest() return ret print(get_md5('colin526133456')) ----------------------------------------------------- def get_sha224(s): new_sha224 = haslib.sha224(s.encode()).digest() return new_sha224 # 如果数据量很大,我们可以分块多次调用update,但是只能使用一个md5_obj,最后计算结果一样。 >>> md5_obj = hashlib.md5() >>> md5_obj.update('colin526133456'.encode('utf-8')) # 首先我们来看它整体加密的结果 >>> ret = md5_obj.hexdigest() >>> print(ret) d7bbf424ae5f3c7e1a8772f69687b1a1 >>> md5_obj = hashlib.md5() >>> md5_obj.update('colin5'.encode('utf-8')) # 拆开了加密,最后得到的结果也是一样的 >>> md5_obj.update('26133456'.encode('utf-8')) >>> ret = md5_obj.hexdigest() >>> print(ret) d7bbf424ae5f3c7e1a8772f69687b1a1 # MD5密码认证,带“加盐”方法:“加盐”就是对原密码添加额外的字符串,然后再生成MD5值 >>> yan = '!任#意%字^符@' >>> md5_pwd = hashlib.md5() >>> md5_pwd.update(("字符串"+yan).encode('UTF-8')) >>> pwd = md5_pwd.hexdigest() >>> pwd '35b1ad27193505826df36039402e9de7' # 加盐方式简写,一句搞定 yan = '!任#意%字^符@' pwd = "字符串" pwd = hashlib.new('md5',(pwd+yan).encode('UTF-8')).hexdigest() # md5文件加密:用于对小文件的一致性校验 def get_file_md5(file_path): md5_obj = hashlib.md5() with open('file_path', encoding = 'utf-8') as f: for line in f: md5_obj.update(line.encode('utf-8')) ret = md5_obj.hexdigest() return ret # 同个核对加密后的值是否一致就可以判断文件内容是否一致 # 对视频或者大文件校验的方法就要用 rb 模式来读取了,rb读出来的就是bytes,所有不需要再encode了 import os import hashlib def get_file_md5(file_path, buffer = 1024): md5_obj = hashlib.md5() file_size = os.path.getsize(file_path) with open(file_path, 'rb') as f: while file_size: content = f.read(buffer) # read 里面传入参数代表每次读取的字符长度 md5_obj.update(content) # 文件是rb形式传输,所以不需要'utf-8' file_size -= len(content) return md5_obj.hexdigest()
Python自带的hmac模块实现了标准的Hmac算法
# hmac 和 hashlib 使用方法类似 import hmac key = '!任#意%字^符@' s = '字符串' def hmac_md5(key, s): return hmac.new(key.encode('utf-8'), s.encode('utf-8'), 'MD5').hexdigest() hmac_md5(key, s) '399b1910dcd9595db1fee6d3b3b05137'