python3 加密模块的实现(hashlib,hmac)

hashlib模块:
Version:Python 3.6.1
hashlib:不可逆加密
hmac:不可逆键值对方式加密

hashlib模块:
hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 信息)来获取这个哈希对象,如:hashlib.new(“MD5”,“username”),hashlib.new(“SHA1”,“username”)等。
(2):通过hashlib.哈希算法名称()来获取这个哈希对象,如:hashlib.md5(),hashlib.sha1()等。
2、设置追加信息:
调用哈希对象的updata(输入的信息)方法,设置追加信息。多次调用后等价于把所有追加的参数全部拼接起来作为一个参数,传递给update(),是累加,不是覆盖。
3、获取输入信息对应的摘要:
调用已经的到哈希对象的digest()或者hexdigest(),可得到传递给update()方法的字符串参数的摘要信息。
(1)digest()与hexdigest()的区别:
a、digest():摘要信息是一个二进制格式的字符串,其中可能包含非ASCII字符,包括NUL字节,该字符串长度可以通过哈希对象的digest_size属性获取。
b、hexdigest():摘要信息是一个16进制格式的字符串,该字符串中只包含16进制的数字,且长度是digest()返回结果长度的2倍。
示例代码1:

def hash_test():     m = hashlib.md5()     m.update(b"username")     m.update(b"password") #最终加密的字符串参数是:username + password     print(m.digest_size)     print(m.digest())     print(m.hexdigest()) hash_test() 

返回结果:

16 b'xd5x1cx9a~x93Stj` xf9`-E))' d51c9a7e9353746a6020f9602d452929 

代码示例2:

def hash_func():     # hashlib.new(name[, data])     创建hashlib(非首选), name=算法名, data:数据     hash = hashlib.new('sha1', 'username'.encode())     strs = hash.name                # hash名称, 可传给new()使用     hash.update("password".encode())    # 字节缓冲区 hash.update(x) hash.update(y) == hash.update(x+y)     hash = hash.copy()                # 拷贝hash对象副本     print(strs, hash)      # algorithms_guaranteed返回的是所有平台支持的hash算法的名称,结果是一个集合     dics = hashlib.algorithms_guaranteed     print(dics)      # algorithms_available返回的是在Python解析器中可用的hash算法的名称, 传递给new()时, 可识别,结果也是一个集合     dics1 = hashlib.algorithms_available     print(dics1)      """     加盐加密方法介绍:     hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)     hash_name:hash名称, password:数据, salt:盐, iterations:循环次数, dklen:密钥长度     """     hash_bytes = hashlib.pbkdf2_hmac('SHA1', b'password', b'80', 100, 64)     print(hash_bytes)      num = hash.digest_size  # hash结果的大小     num1 = hash.block_size  # hash算法的内部块的大小     print(num, num1)  hash_func() 

返回结果:

sha1 <sha1 HASH object @ 0x000002741602E030> {'sha256', 'blake2s', 'sha224', 'sha3_512', 'shake_128', 'md5', 'sha384', 'blake2b', 'sha3_256', 'sha512', 'sha3_224', 'shake_256', 'sha1', 'sha3_384'} {'sha256', 'blake2b', 'sha3_256', 'whirlpool', 'SHA', 'md5', 'sha384', 'RIPEMD160', 'dsaEncryption', 'sha', 'sha1', 'md4', 'SHA1', 'MD4', 'sha224', 'DSA-SHA', 'SHA256', 'sha512', 'sha3_224', 'SHA384', 'SHA224', 'SHA512', 'ripemd160', 'MD5', 'dsaWithSHA', 'blake2s', 'sha3_512', 'shake_128', 'DSA', 'shake_256', 'ecdsa-with-SHA1', 'sha3_384'} b']x85Cxffx1dxe8xcex97x128x9bPxe6x98xdf/x1eQx19xb4x04vxf5xcdx00xb8xff#xeexa7x07x81)xb8xc7Sex85xefxfax9dx0ex9auA8x19tx0exeexb5`x9bx07:2Mxd4xc0x0cxfaz^/' 20 64 

hmac模块
hmac算法也是一种一种单项加密算法,并且它是基于上面各种哈希算法/散列算法的,只是它可以在运算过程中使用一个密钥来增增强安全性。hmac模块实现了HAMC算法,提供了相应的函数和方法,且与hashlib提供的api基本一致。
使用步骤:
hmac模块的使用步骤与hashlib模块基本一致,只是在获取hmac对象时,只能使用hmac.new()函数,因为hmac模块没有提供与具体哈希算法对应的函数来获取hmac对象。如:hashlib可以用hashlib.md5()来产生一个哈希对象,但是hmac不行。

代码示例1:

def hmac_demo():     hash = hmac.new(b"pwd")     hash.update(b"uname")     h_str = hash.hexdigest()     print(h_str.upper())     boolean = hmac.compare_digest(h_str, hmac.new("pwd".encode(), "uname".encode()).hexdigest())     print(boolean) hmac_demo() 

返回结果:

675440AD536E602C322C90F8E0051975 True 

示例代码2:

def hmac_func():     # 创建key和内容,再进行加密     # hmac.new(key, msg=None, digestmod=None)     # 创建新的hmac对象, key:键, msg:update(msg), digestmod:hash名称(同hashlib.new())(默认md5)     hc = hmac.new("userid".encode())     hc.update("username".encode())  # 字节缓冲区 hc.update(a) hc.update(b) == hc.update(a+b)     hash_bytes = hc.digest()  # 字节hash     print(hash_bytes)     hash_str = hc.hexdigest().upper()  # 16进制hash字符串     print(hash_str)     hc = hc.copy()  # 拷贝hmac副本     print(hc)     num = hc.digest_size  # hash大小     print(num)     strs = hc.name  # hash名称     print(strs)     # hmac.compare_digest(a, b) // 比较两个hash密钥是否相同, 参数可为: str / bytes-like object, (注:建议使用此方法,不建议使用a==b)     boolean = hmac.compare_digest(hmac.new("uid".encode(), "uname".encode()).digest(), hmac.new("uid".encode(), "uname".encode()).digest())     print(boolean)      hmac_func() 

返回结果:

b'x82jUxd4Ixa3A?x1dx05x00xd89xf9zxb1' 826A55D449A3413F1D0500D839F97AB1 <hmac.HMAC object at 0x0000014F15668080> 16 hmac-md5 True 

不对之处还望批评指正,谢谢!!

版权声明:玥玥 发表于 2021-04-13 2:52:34。
转载请注明:python3 加密模块的实现(hashlib,hmac) | 女黑客导航