python3 加密模块的实现(hashlib,hmac)
python3 加密模块的实现(hashlib,hmac)
hashlib模块:
Version:Python 3.6.1
hashlib:不可逆加密
hmac:不可逆键值对方式加密
hashlib模块:
hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 信息摘要算法(Message Digest Algorithm)实现了一个公共的、通用的接口,也可以说是一个统一的入口。因为hashlib模块不仅仅是整合了md5和sha模块的功能,还提供了对更多中算法的函数实现,如:MD5,SHA1,SHA224,SHA256,SHA384和SHA512。
使用步骤:
1、获取一个哈希算法对应的哈希对象:
(1):通过hashlib.new(哈希算法名称,初始出入信息)来获取这个哈希对象,如: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’\xd5\x1c\x9a~\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’]\x85C\xff\x1d\xe8\xce\x97\x128\x9bP\xe6\x98\xdf/\x1eQ\x19\xb4\x04v\xf5\xcd\x00\xb8\xff#\xee\xa7\x07\x81)\xb8\xc7Se\x85\xef\xfa\x9d\x0e\x9auA8\x19\t\x0e\xee\xb5`\x9b\x07:2M\xd4\xc0\x0c\xfaz^/’
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’\x82jU\xd4I\xa3A?\x1d\x05\x00\xd89\xf9z\xb1′
826A55D449A3413F1D0500D839F97AB1
<hmac.HMAC object at 0x0000014F15668080>
16
hmac-md5
True