hashlib模块

  hashlib模块提供了很多加密的算法,该模块实现了许多不同的安全散列和消息摘要算法的通用接口。包括FIPS安全散列算法SHA1,SHA224,SHA256,SHA384和SHA512(在FIPS 180-2中定义)以及RSA的MD5算法。术语“安全散列”和“消息摘要”是可以互换的。老被称为消息摘要算法。现代术语是安全散列。

什么是摘要算法呢?

  摘要算法又称为哈希算法,散列算法。它通过一个函数,把任意长度的数据转换为一个长度固顶的数据串(通常用16进制的字符串表示)用于加密相关的操作。

  该模块中始终存在的散列算法的构造方法是sha1(),sha224(),sha256(),sha384(),sha512(),blake2b()和blake2s()。 通常也可以使用md5(),但是如果您使用的是一个罕见的“FIPS兼容”版本的Python,那么它可能会丢失。 根据Python在您的平台上使用的OpenSSL库,还可以使用其他算法。 在大多数平台上,sha3_224(),sha3_256(),sha3_384(),sha3_512(),shake_128(),shake_256()也可用。

  使用md5()创建一个SHA1哈希对象。可以对bytes对象使用update()方法。 并用digest()或hexdigest()方法,向其提出要提供给它的数据的哈希。

请注意: update()不支持字符串对象 , 因为散列字节 , 而不是字符。

例如,要获取字符串的加密“I'm just a porter”

>>> import hashlib

>>> m=hashlib.sha256()
>>> m.update(b"I'm just")
>>> m.update(b" a porter")
>>> print(m.hexdigest())
357f6b61a95c58cec21f335eb20f18cd73132b7af78f49c9ece2ca0a9767ec5f

效果等同:

>>>  m.update(b"I'm just a porter")

>>> strs='Im just a porter'

>>> m.update(str.encode('utf-8'))

hexdigest()方法。

返回传递给update()方法的数据。仅包含十六进制数字。这可以用于非二进制环境中安全地交换值。

  以上加密算法虽然很厉害,但仍然存在缺陷,通过撞库可以反解。所以必要对加密算法中添加自定义key再来做加密。

>>>  hash = hashlib.md5('python'.encode('utf-8'))

>>>  hash.update('admin'.encode('utf-8'))
>>>  print(hash.hexdigest())
75b431c498b55557591f834af7856b9f

例子:

获取文件的MD5

import 
hashlib
def 
md5(file_name):
        
if 
not 
os.path.isfile(file_name):  
# 如果校验md5的文件不是文件,返回空
            
return
        file_
hash 
= 
hashlib.md5()
        
= 
open
(file_name, 
'rb'
)
        
while 
True
:
            
= 
f.read(
8096
)
            
if 
not 
b:
                
break
            
file_hash.update(b)   
        
f.close()
        
return 
file_hash.hexdigest()

利用md5进行用户登陆网站进行注册之后密码加密的基本事例

import hashlib
def 
md5(arg):
#这是加密函数,将传进来的函数加密
    
md5_pwd 
= 
hashlib.md5(bytes(
'abd'
,encoding
=
'utf-8'
))
    
md5_pwd.update(bytes(arg,encoding
=
'utf-8'
))
    
return 
md5_pwd.hexdigest()
#返回加密的数据
def 
log(user,pwd):
#登陆时候时候的函数,由于md5不能反解,因此登陆的时候用正解
    
with 
open
(
'db'
,
'r'
,encoding
=
'utf-8'
) as f:
        
for 
line 
in 
f:
            
u,p
=
line.strip().split(
'|'
)
            
if 
=
=
user 
and 
=
= 
md5(pwd):
#登陆的时候验证用户名以及加密的密码跟之前保存的是否一样
                
return 
True
def 
register(user,pwd):
#注册的时候把用户名和加密的密码写进文件,保存起来
    
with 
open
(
'db'
,
'a'
,encoding
=
'utf-8'
) as f:
        
temp 
= 
user
+
'|'
+
md5(pwd)
        
f.write(temp)
 
i
=
input
(
'1表示登陆,2表示注册:'
)
if 
i
=
=
'2'
:
    
user 
= 
input
(
'用户名:'
)
    
pwd 
=
input
(
'密码:'
)
    
register(user,pwd)
elif 
i
=
=
'1'
:
    
user 
= 
user 
= 
input
(
'用户名:'
)
    
pwd 
=
input
(
'密码:'
)
    
r
=
log(user,pwd)
#验证用户名和密码
    
if 
=
=
True
:
        
print
(
'登陆成功'
)
    
else
:
        
print
(
'登陆失败'
)
else
:
    
print
(
'账号不存在'
)

注:使用版本为3.5