python-加密算法
1.hashlibhashlib 模块定义了一个API 类访问不同的密码散列算法. 要使用一个特定的散列算法,可以使用适当的构造器或new() l来创建一个散列对象。不论使用哪个具体的算法,都是使用相同的API.1.1 散列算法md5、sha1、sha224、sha256、sha384、sha512 这些算法在所有的平台都可用,有些依赖于底层库,分别由 algorithms_guaranteed
·
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))
更多推荐
已为社区贡献1条内容
所有评论(0)