hmac檢驗客戶端合法性
阿新 • • 發佈:2018-10-07
對象 cli 登陸認證 lose 隨機生成 hashlib 根據 server clas
1.服務端
# 驗證客戶端是否合法 # 不依靠登陸認證 # 當有一個客戶端訪問你的時候,建立了tcp後,server端主動發起一個數據,數據為想加密的bytes類型的數據。 # 客戶端拿到要加密的bytes類型的數據, # import hmac # 該模塊與hashlib類似 # import os # # h = hmac.new() # secret_key 需要一個密鑰,與想要加密的bytes類型數據 # content = h.digest() # 拿到一個密文內容 # hmac.compare_digest() # 比較 ,密文與另外一個密文# # print(os.urandom(32)) # 隨機生成32個字節 import socket import hmac # 該模塊與hashlib類似 import os def check_conn(conn): random_msg = os.urandom(32) # 得到一個隨機的32個字節 conn.send(random_msg) # 隨機發送32個字節 h = hmac.new(secret_key, random_msg) # 使用密鑰secret_key對發送出去的32個隨機字節進行加密得到一個hmac對象 digest = h.digest() #由hmac對象得到一個密文 client_digest = conn.recv(1024) return hmac.compare_digest(digest, client_digest) # 比較自己對32個字節加密後得到的密文,與客戶端得到32個字節後加密得到的密文是否一樣 secret_key = b‘egg‘ # 密鑰 sk = socket.socket() sk.bind((‘127.0.0.1‘, 8090)) sk.listen() conn, addr = sk.accept() res = check_conn(conn) if res:print(‘合法的客戶端‘) conn.send(b‘OK‘) else: print(‘不合法的客戶端‘) conn.send(b‘NO‘) conn.close() sk.close()
客戶端
import socket import hmac secret_key = b‘egg‘ sk = socket.socket() sk.connect((‘127.0.0.1‘, 8090)) msg = sk.recv(1024) # 得到的是的32個隨機字節 h = hmac.new(secret_key, msg) # 根據與服務端協商好的secret_key,對收到的32個隨機字節進行加密,得到一個hmac對象 digest = h.digest() # 由hmac對象得到了32隨機字節與secret_key加密後的密文內容 sk.send(digest) # 將密文內容發送到服務端 print(sk.recv(1024).decode(‘utf-8‘)) sk.close()
hmac檢驗客戶端合法性