一 * hashlib模塊
1.哈希算法哈希函數(shù) 又稱 散列函數(shù) 把數(shù)據(jù)轉(zhuǎn)化為一串?dāng)?shù)字
對(duì)同一個(gè)數(shù)據(jù)在同一次運(yùn)行同一個(gè)數(shù)據(jù)哈希結(jié)果相同
對(duì)每一個(gè)相同的值進(jìn)行哈希結(jié)果是相同的
可哈希??????????????? 不可變類型???? 數(shù)字字符串
不可哈希 ? ? ? ? ? ? 可變類型????? 字典元組列表
字典的key鍵是不可變且唯一的*可哈希*驻售,value值是可變的*不可哈希*
set集合是去重的也是散列函數(shù)
2.hashlib模塊是加密的
???? 1.加密也即摘要算法? 用法import hashlib
???????? md5?? 業(yè)界最常用的算法 32位16進(jìn)制
???????????? sha1???? 算法??????????????????? 40位16進(jìn)制
文件一致性???????
作用
驗(yàn)證加密??
基本的摘要會(huì)撞庫
加鹽是惡意注冊(cè)
動(dòng)態(tài)加鹽 -------安全的 username切片進(jìn)行修飾
2.hmac 對(duì)hash進(jìn)行封裝
???????? hmac(b"salt",b"hello",md5)
????????? obj=hashlib.sha1()
????????? obj.digest()??? #字節(jié)串
?? 3.獲得隨機(jī)數(shù)
import os
print(os.urandom(20))
3.登陸案例
a.txt
4.MD5加鹽 驗(yàn)證文件一致性
二 * hashlib中的sha1算法
2.驗(yàn)證客戶端是否合法
server.py
client.py
3.客戶端驗(yàn)證合法之后進(jìn)行通話
server.py
import socket
import hashlib
sk=socket.socket()
sk.bind(("127.0.0.1",9090))
sk.listen(5)
conn,addr=sk.accept()
salt="hello"
str="來到醫(yī)院"
ret_s=conn.send(str.encode("utf-8"))
ret_c=conn.recv(1024).decode("utf-8")
print(ret_c)
#對(duì)接收的內(nèi)容進(jìn)行加密
obj=hashlib.md5(salt.encode("utf-8"))
obj.update(str.encode("utf-8"))
str_obj=obj.hexdigest()
#將加密后的內(nèi)容和加密之前的內(nèi)容進(jìn)行對(duì)比
if ret_c == str_obj:
print("合法的客戶端允許鏈接")
while True:
s=input("發(fā)送消息給client>>>").encode("utf-8")
ret=conn.send(s)
print(ret)
msg=conn.recv(1024).decode("utf-8")
print(msg)
else:
print("不合法的客戶端非法不連接")
conn.close()
sk.close()
client.py
三? *? 驗(yàn)證合法之后進(jìn)行封裝?????????????
1.server.py
#創(chuàng)建連接
import hmac
def? mysocket():
? ? sk = socket.socket()
? ? sk.bind(('127.0.0.1', 8080))
? ? sk.listen(3)
? ? conn, addr = sk.accept()
? ? return conn,sk
#驗(yàn)證
def auth(conn,sk):
? ? salt = b'hello'
? ? str = os.urandom(20)
? ? conn.send(str)? # 發(fā)送字節(jié)串
? ? md5_s = conn.recv(1024)? # 接收客戶端發(fā)來的MD5_s
?? #以下是hashlib模塊
? ? # obj = hashlib.md5(salt)
? ? # obj.update(str)
? ? # r_str = obj.hexdigest()
#以下是hmac模塊
? ? obj = hmac.new(salt,str)
? ? r_str = obj.digest()
? ? if md5_s == r_str:
? ? ? ? print('合法的客戶端旧烧,允許連接兔魂!')
? ? ? ? com()
? ? else:
? ? ? ? print("非法!D吨印!")
? ? conn.close()
? ? sk.close()
#通信函數(shù)
def com():
? ? while True:
? ? ? ? s = input("發(fā)送消息給client 》》》").encode('utf-8')
? ? ? ? conn.send(s)
? ? ? ? msg = conn.recv(1024).decode('utf-8')
? ? ? ? print(msg)
if __name__ == '__main__':
? ? conn,sk = mysocket()
? ? auth(conn,sk)
cient.py
import hmac
def mysocket():
? ? sk = socket.socket()
? ? sk.connect(('127.0.0.1',8080))
? ? return sk
def auth(sk):
? ? salt = b'hello'
? ? bytes = sk.recv(1024) # 接收字符串
#以下是hashlib模塊
? ? # obj = hashlib.md5(salt)
? ? # obj.update(s)
? ? # r_str = obj.hexdigest()
#以下是hmac模塊
? ? obj = hmac.new(salt, bytes)
? ? r_str = obj.digest()
? ? sk.send(r_str)
? ? com()
? ? sk.close()
def com():
? ? while True:
? ? ? ? msg = sk.recv(1024).decode('utf-8')
? ? ? ? print(msg)
? ? ? ? s = input("發(fā)送消息給server 》》》").encode('utf-8')
? ? ? ? sk.send(s)
if __name__ == '__main__':
? ? sk = mysocket()
? ? auth(sk)