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()

 

hmac模块

  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'

 

posted @ 2020-03-18 11:15  海澜时见鲸  阅读(295)  评论(0)    收藏  举报