9.8 hashlib模块

9.8 hashlib模块

  • 思考:为什么要有hashlib模块?hashlib模块有什么用?
    (1)对字符加密,其实是一个自定义的字符编码表。
    (2)原来0和1转换成字符,而现在的是字符转成另一种字符。
    (3)应用场景:在某平台用户输入账号密码,账号密码需要传输给平台,以防账号密码被拦截,则需要对账号密码串进行加密。

1.hashlib.md5()

用的多,相比较更难破解

import hashlib

m=hashlib.md5() 
# pwd=b'helloworld'
pwd='helloworld'.encode('utf-8') #在哈希之前变为二进制形式
m.update(pwd)
print(m.hexdigest())

#输出
fc5e038d38a57032085441e7fe7010b0

(1)特性1:长度一样

'helloworld'  fc5e038d38a57032085441e7fe7010b0
'123'         202cb962ac59075b964b07152d234b70

(2)特性2: hash加密的字符串一样,则哈希结果一样

'helloworld'  fc5e038d38a57032085441e7fe7010b0

(3)特性3:如果使用同一个哈希字符编码表,不断的哈希结果会累加。

import hashlib

m=hashlib.md5() 
pwd=b'123'
# pwd='helloworld'.encode('utf-8') #在哈希之前变为二进制形式
m.update(pwd)
print(m.hexdigest())

#输出
#'123'      202cb962ac59075b964b07152d234b70


m.update(b'123456')
print(m.hexdigest())

#输出
#'123456'   1e191d851b3b49a248f4ea62f6b06410

m=hashlib.md5() 
m.update(b'123123456')
print(m.hexdigest())

#输出
#'123123456'  1e191d851b3b49a248f4ea62f6b06410

总结

  1. hash加密之后长度一样
  2. hash加密的东西一样则哈希结果一样
  3. 如果使用同一个哈希字符编码表,不断的哈希结果会累加。

(4)小练习

#假如我们知道hash的某账号会设置这几个密码
import hashlib
pwd_list=[
    'hash3714',
    'hash1313',
    'hash94139413',
    'hash123456',
    '123456hash',
    'h123ash'
]
#hash值要拿到,容易获取,获取某一个人的很简单,获取某个数据库很难。

def break_pwd(hash_pwd):
    for pwd in pwd_list:
        m=hashlib.md5()  #在外面生成就会进行累加,只有一个hash值,所以在内部生称
        m.update(pwd.encode('utf-8'))
        
        if  m.hexdigest()==hash_pwd:
            return pwd

if __name__=='__main__':
    hash_pwd='0562b36c3c5a3925dbe3c4d32a4f2ba2'
    pwd=break_pwd(hash_pwd)
    print(f'密码是{pwd}')


#输出
密码是hash123456

2. hmac.new()

安全性更强

import hmac,hashlib

m=hmac.new(b'123',digestmod=hashlib.md5) #加盐处理 '123'固定在服务器,可以隔段时间就改变,提高安全性
m.update(b'123')
print(m.hexdigest())
#输出
#b2a1ec0f3e0607099d7f39791c04e9a4

m.update(b'456')
print(m.hexdigest())
#输出
#a31dce88633f3393f6c475525ff48301

m=hmac.new(b'123',digestmod=hashlib.md5)
m.update(b'123456')
print(m.hexdigest())

#输出
#a31dce88633f3393f6c475525ff48301
b2a1ec0f3e0607099d7f39791c04e9a4
a31dce88633f3393f6c475525ff48301
a31dce88633f3393f6c475525ff48301

也具有hash的三个特性。

3.uuid模块补充

import uuid
for i in range(10):
    print(uuid.uuid4()) #按照时间生成的字符串,永不重复。
posted @ 2025-09-02 17:34  bokebanla  阅读(7)  评论(0)    收藏  举报