hashlib加密模块主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法,HMAC消息签名(HMAC-SHA1,....)
阅读原文时间:2023年07月09日阅读:3

用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

MD5 摘要输出

# ######## md5 ########
import hashlib

hash = hashlib.md5()

对字节计算md5

hash.update('admin'.encode())

md5 bytes值输出:原始128位 输出其可打印字符 (ASCII中95个可打印字符直接显示,非可打印字符输出\x开头的16进制字符),总输出长度不固定

print(hash.digest())
输出:b'!#/)zW\xa5\xa7C\x89J\x0eJ\x80\x1f\xc3'

md5 16进制字符串输出,长度固定32(128/4)个字符

print(hash.hexdigest())
输出:'21232f297a57a5a743894a0e4a801fc3'

#MD5 加密后的位数一般为两种,16 位与 32 位。16 位实际上是从 32 位字符串中,取中间的第 9 位到第 24 位的部分
hash.hexdigest()[8:24]
输出:'7a57a5a743894a0e'

更多案例:

import hashlib

m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())
m.update(b"It's been a long time since last time we …")

print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash
'''
def digest(self, *args, **kwargs): # real signature unknown
""" Return the digest value as a string of binary data. """
pass

def hexdigest(self, *args, **kwargs): # real signature unknown
""" Return the digest value as a string of hexadecimal digits. """
pass

'''
import hashlib# ######## sha1 ########

hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest())

######## sha256

hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest())

######## sha384

hash = hashlib.sha384()
hash.update('admin')
print(hash.hexdigest())

######## sha512

hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())

128位md5 digest,

还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密

消息认证码MAC(Message Authentication Code)是一种确认完整性并进行认证的技术,简称为MAC。消息认证码的输入包括 任意长度的消息和一个发送者与接受者之间 共享的密钥,它可以输出固定长度的数据,这个数据成为MAC值。要计算MAC必须持有共享密钥,没有共享密钥的人就无法计算MAC值,消息认证码正是利用这一性质来完成认证的。

HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思。

HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出的新的单向散列函数,也同样可以使用。

使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512。

1、HMAC计算步骤解析

示意图:

图解:

1. 密钥填充

如果密钥比单向散列函数分组长度要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。

如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作HMAC的密钥。

2. 填充后的密钥与ipad的XOR

将填充后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思。

XOR运算所得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。

3. 与消息组合

随后,将ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。

4. 计算散列值

将3的结果输入单向散列函数,并计算出散列值。

5. 填充后的密钥与opad的XOR

将填充后的密钥与被称为opad的比特序列进行XOR运算,opad是将01011100这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。

XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。

6. 与散列值组合

将4的散列值拼在opadkey后面。

7. 计算散列值

将6的结果输入单向散列函数,并计算出散列值,这个散列值就是最终的MAC值。

通过上述流程可以看出,最后得到的MAC值,一定是一个和输入的消息以及密钥都相关的长度固定的比特序列。

2、HMAC 举例

# hmac.new(key,msg,digestmod)

key:加盐的key,

msg:加密的内容,

digestmod:加密的方式

1. hmac消息签名(默认使用MD5加算法)

import hmac

默认使用是md5算法

digest_maker = hmac.new('secret-shared-key'.encode('utf-8'))
with open('test3.html', 'rb') as f:
while True:
block = f.read(1024)
if not block:
break
digest_maker.update(block)
digest = digest_maker.digest()
hexdigest = digest_maker.hexdigest()
print(digest)
print(hexdigest)

示例输出:

b'U\xe8\xb5\x9c\xf5\xc3\xbe\xa8VTM,N\xdb\xaaN'
55e8b59cf5c3bea856544d2c4edbaa4e

2. hmac消息签名摘要(使用SHA1加算法)

import hmac

使用SHA1算法

digest_maker = hmac.new('secret-shared-key'.encode('utf-8'), b'', digestmod='SHA1')

digest_maker = hmac.new('secret-shared-key'.encode('utf-8'), b'', digestmod=hashlib.sha1) # import hashlib

hmac.new(key,msg,digestmod)

key:加盐的key,

msg:加密的内容,

digestmod:加密的方式

with open('test3.html', 'rb') as f:
while True:
block = f.read(1024)
if not block:
break
digest_maker.update(block)
digest = digest_maker.digest()
hexdigest = digest_maker.hexdigest()
print(digest)
print(hexdigest)

示例输出

b'C?\xb2\xe2\xdeW\n\xb7\xe1\x08\xef\xa7{\xa6\xb43\x10\xc9\xcb\xa2'
433fb2e2de570ab7e108efa77ba6b43310c9cba2

鸣谢:https://blog.csdn.net/chengqiuming/article/details/82822933

鸣谢:http://www.cppcns.com/jiaoben/python/295086.html

更多关于md5,sha1,sha256等介绍的文章看这里https://www.tbs-certificates.co.uk/FAQ/en/sha256.html

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章