hashlib 模块
这个模块针对不同的安全哈希和消息摘要算法实现了一个通用的接口。
包括 FIPS 的 SHA1, SHA224, SHA256, SHA384, and SHA512 算法,以及 RSA 的 MD5 算法。
术语“安全哈希”和“消息摘要”是可互换的,较旧的算法被称为消息摘要,现代术语是安全哈希。
import hashlib
# 1.基本的使用
#######################
hm = hashlib.md5()
# update() 方法向这个对象输入 字节类对象
password = '123456'.encode()
hm.update(password)
# digest() 或 hexdigest() 方法
# 获得到目前为止输入这个对象的拼接数据的 digest
print(hm.hexdigest())
# 2.加盐
#######################
_salt = '嘿嘿哈哈'.encode()
hm = hashlib.md5(_salt)
password = '123456'.encode()
hm.update(password)
print(hm.hexdigest())
文件校验
import hashlib
def check_file_sha256(filename:str) -> str:
hm = hashlib.sha256()
with open(filename, 'rb') as fp:
while True:
content = fp.read(1024)
if content:
hm.update(content)
continue
break
return hm.hexdigest()
校验客户端的合法性
# server端
import os
import hashlib
import socketserver
class MyServer(socketserver.BaseRequestHandler):
_secret_key = '小兔乖乖,把门开开'.encode()
# os.urandom(n) 返回n个byte长度适合用于加密的一个string
_salt = os.urandom(20)
def sec_md5(self, key:bytes, salt:bytes) ->str:
hm = hashlib.md5(salt)
hm.update(key)
return hm.hexdigest()
def auth(self) -> bool:
# 获取client的 socket 连接对象
conn = self.request
# 给client发送加盐的内容
conn.send(self._salt)
# 接受客户端计算出的加密结果
client_code = conn.recv(32).decode()
# 计算刚刚发送给客服端的加密结果
server_code = self.sec_md5(self._secret_key, self._salt)
return client_code == server_code
def handle(self) -> None:
if not self.auth():
self.request.send(b'0')
else:
self.request.send(b'1')
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer)
server.serve_forever()
import socket,hashlib
# 秘钥
secret_key = '小乖乖,把门开开'.encode()
def auth(secret_key:bytes, salt:bytes) -> str:
hm = hashlib.md5(salt)
hm.update(secret_key)
return hm.hexdigest()
with socket.socket() as sk:
sk.connect(('localhost', 8080))
salt = sk.recv(20)
code = auth(secret_key, salt)
sk.send(code.encode())
b = sk.recv(1)
if b == b'0':
print('验证不通过,请仔细核对秘钥')
elif b == b'1':
print('验证通过,为合法连接。。。。。。。。')