1.hashlib
hashlib 模块定义了一个API 类访问不同的密码散列算法. 要使用一个特定的散列算法,可以使用适当的构造器或new() l来创建一个散列对象。不论使用哪个具体的算法,都是使用相同的API.
1.1 散列算法
md5、sha1、sha224、sha256、sha384、sha512 这些算法在所有的平台都可用,有些依赖于底层库,分别由 algorithms_guaranteed 和algorithms_available 提供
import hashlib
print("guaranteed:\n{}\n".format(' '.join(sorted(hashlib.algorithms_guarnteed))))
print("available:\n{}\n".format(' '.join(sorted(hashlib.algorithms_available))))
1.2md5
import hashlib
lorem = "hello world"
h = hashlib.md5()
h.update(lorem,encode('utf-8'))
print(h.hexdigest()) # 二进制 摘要值 使用 digest()
1.3sha1
import hashlib
lorem = "hello world"
h = hashlib.sha1()
h.update(lorem.encode('utf-8'))
print(h.hexdigest())
1.4 按 名创建散列
import argparse
import hashlib
import sys
lorem = "hello world"
parse = argparse.ArgumentParser("hash demo")
parse.add_argument(
	'hash_name',
	choices=hashlib.algorithms_available,
	help='the name of the hash algorithm to use',
)
parse.add_argument(
	'data',
	nargs='?',
	default=lorem,
	help='the input data to hash,default to lorem ipsum',
)
args = parser.parse_args()
# 使用new  方法创建 散列计算器
h = hashlib.new(args.hash_name)
h.update(args.data.encode('utf-8'))
print(h.hexdigest())

1.5 增量更新
import hashlib
lorem = "hello world"
h = hashllib.md5()
h.update(lorem.encode('utf-8'))
all_at_once = h.hexdigest()

def chunkize(size,text):
	start = 0
	while start < len(text):
		chunk = text[start:start+size]
		yield chunk
		start += size
	return 
h = hashlib.md5()
for chunk in chunkize(64,lorem.encode('utf-8')):
	h.update(chunk)
line_by_line = h.hexdigest()
print("all at once:",all_at_once)
print("line by line:",line_by_line)
print("same        :",(all_at_once == line_by_line))
'''
	增量更新比将整个文件读入内存更高效,而且生成相同的结果
'''
2.hmac:密码消息签名与签名
HMAC算法可以用于验证信息的完整性,这些信息可以在应用之间传递。基本思想是 生成实际数据的一个密码散列,并提供一个共享的秘钥。然后使用秘钥得到消息。
2.1消息签名

digest_maker = hmac.new(b'secret-shared-key-goes-here')
with open('lorem.txt','rb') as f:
	while True:
		block = f.read(1024)
		if not block:
			break
		digest_maker.update(block)
print(digest_maker.hexdigest())
2.2 选择摘要类型
import hmac
import hashlib

digest_maker = hmac.new(
	b'secret-shared-key-goes-here',
	b'',
	'sha1',
)
with open("lorem.txt",'rb') as f:
	while True:
		block = f.read(1024)
		if not block:
			break
		digest_maker.update(block)
digest = digest_maker.hexdigest()
print(digest)
'''
new() 函数有三个参数:
	第一个参数是 秘钥,通信双方共享
	第二个参数是 初始消息
	第三个参数是 摘要模块
'''
2.3 二进制摘要
'''
	hexdigest 是 digest 值得不同表示 这是一个二进制值	包括不可打印字符
'''
import base64
import hmac
import hashlib

with open("lorem.txt","rb") as f:
	body = f.read()

hash = hmac.new(
	b'secret-shared-key-goes-here',
	body,
	hashlib.sha1,
)

digest = hash.digest()
# base64 版本的二进制摘要
print(base64.encodestring(digest))
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐