python高级(hashlib加密模块)

hashlib模块

Python的hashlib主要提供了常见的摘要算法,python3.x版本里代替了md5模块和sha模块,如SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法。

什么是摘要算法呢?MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),是一种被广泛使用的密码散列函数,可以产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。SHA1的全称是Secure Hash Algorithm(安全哈希算法) ,是 SHA 家族的其中一个算法,它经常被用作数字签名。SHA1基于MD5,加密后的数据长度更长。摘要算法又称哈希算法、散列算法。

摘要算法的基本原理:通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

举个例子,你写了一篇文章,内容是一个字符串'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,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

 

hashlib相关的命令

hashlib.new(name[, data])

通用构造函数,name参数表示要使用的hash算法的名称,可以是上述列出的所有hash算法以及OpenSSL库支持的其他算法。使用算法名称构造函数较使用new()更快

>>> h = hashlib.new("sha256", b"Nobody inspects the spammish repetition")
>>> h.digest()
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'

hashlib.algorithms_guaranteed

所有平台的hashlib模块都支持的hash算法的名称集合。md5也在此集合中(Note that ‘md5’ is in this list despite some upstream vendors offering an odd “FIPS compliant” Python build that excludes it.)。

hashlib.algorithms_available

当前运行的python解释器支持的hash算法的名称集合,在new()构造函数中使用都能被正确识别。同一算法可能以不同名称出现多次。
hashlib.algorithms_guaranteed的结果集总是hashlib.algorithms_available结果集的子集

hash.digest_size

hash对象的字节长度

hash.block_size

hash对象的内部块大小

hash.name

hash对象的名称

hash.update(data)

传递类字节参数(通常是bytes)更新hash对象。重复调用update()等同于单次的拼接调用:m.update(a); m.update(b)等同m.update(a+b)

从python3.1开始,为了更好的多线程性能,使用OpenSSL支持的hash算法且处理数据量大于2047个字节的update(或创建)操作发生时,将释放python全局解释器锁允许其他线程运行

hash.digest()

截止此方法调用时,update()已接收的数据的摘要,是一个可包含0到255之间所有字节的字节对象

hash.hexdigest()

类似于digest(),不过是以双倍长度的只包含十六进制数字的字符串对象返回摘要值。

hash.copy()

返回hash对象的克隆

 

例:

import hashlib

obj = hashlib.md5()

obj.update('hello'.encode('utf8'))

print(obj.hexdigest())

注意:hashlib 加密啊的字符串类型为二进制编码,直接加密字符串会报如下错误:

TypeError: Unicode-objects must be encoded before hashing

或者使用byte转换为二进制

shab1 = hashlib.sha1()
shab1.update(bytes(string,encoding='utf-8'))
res = shab1.hexdigest()
print("sha1采用byte转换的结果:",res)

 

高级加密

以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

low = hashlib.md5()

low.update('ab'.encode('utf-8'))

res = low.hexdigest()

print("普通加密:",res)

high = hashlib.md5(b'beyondjie')

high.update('ab'.encode('utf-8'))

res = high.hexdigest()

print("采用key加密:",res)

输出结果:

普通加密: 187ef4436122d1cc2f40dc2b92f0eba0

采用key加密: 1b073f6b8cffe609751e4c98537b7653

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值