base64
import base64 # Base64是一种用64个字符来表示任意二进制数据的方法。常用于在URL、Cookie、网页中传输少量二进制数据。
encode_val = base64.b64encode('test ak47'.encode()) # 将bytes类型转换成base64类型 返回一个bytes类型
decode_val = base64.b64decode(encode_val) # 将得到的值进行解码 可以是字符串类型
print(encode_val, type(encode_val), decode_val.decode())
hmac
import hmac # hmac模块实现了标准的Hmac算法。
def test_md5_hmac():
msg = 'test'.encode() # 将传入的参数转成bytes类型
key = 'mykey'.encode() # 将key转成bytes类型 这个过程也成加盐
# hm = hmac.new(key, msg, digestmod='MD5') # 使用md5的方法计算
# return hm.hexdigest()
hm = hmac.new(key) # 加盐操作
hm.update(msg) # 类似hashlib 计算数据
return hm.hexdigest()
if __name__ == "__main__":
pass_md5 = test_md5_hmac()
print(pass_md5, type(pass_md5), len(pass_md5))
hashlib
import hashlib # hashlib提供了常见的摘要算法:摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
'''
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。
如果有人篡改了你的文章,并发表为'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因为根据'how to use python hashlib - by Bob'计算出的摘要不同于原始文章的摘要。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
'''
def test_sha256(password):
# 利用sha256生成密码
h = hashlib.sha256() # 创建一个实例
# h.update(password.encode('utf-8')) # 开始处理数据,接受一个bytes类型的值
# 对数据进行加盐处理,为什么要这样做,对呀密码进行加密的时候 可能会出现使用123456 111111 password等简单密码,因为算法生成得到的值永远是一样的
# 所以有可能会被有心人士轻松的对比出来,所以我们进行加盐操作后,只有对方不知道我们加的值是什么,那么对方就无法得到加密数据的明文值
h.update((password + '-mykey').encode('utf-8'))
# h_result = h.hexdigest() # 得出计算结果 返回一个16进制字符串
h_result = h.digest() # 得出计算结果 返回一个bytes类型
return h_result
def test_md5():
# 利用md5生成密码
h = hashlib.md5()
# 当需要计算的数据过大时 可以拆分计算 得到的结果任然是一样的
h.update('1234'.encode('utf-8'))
h.update('56'.encode('utf-8'))
h_result = h.hexdigest()
return h_result
if __name__ == "__main__":
pass_sha256 = test_sha256('123456')
pass_md5 = test_md5()
print(pass_sha256, type(pass_sha256), len(pass_sha256))
print(pass_md5, type(pass_md5), len(pass_md5))
# print(dir(hashlib))
import chardet
# 使用 chardet 猜测bytes的编码
print(chardet.detect(pass_sha256))