溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python如何實現(xiàn)并發(fā)和驗證客戶端的合法性

發(fā)布時間:2022-02-21 15:31:43 來源:億速云 閱讀:128 作者:iii 欄目:開發(fā)技術

這篇“python如何實現(xiàn)并發(fā)和驗證客戶端的合法性”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“python如何實現(xiàn)并發(fā)和驗證客戶端的合法性”文章吧。

一、socketserver實現(xiàn)并發(fā)

tcp協(xié)議的socket是只能和一個客戶端通信的,使用socketserver可以實現(xiàn)和多個客戶端通信,他是在socket的基礎上進行的封裝,底層還是調(diào)用的socket。

socket是底層模塊

socketserver是基于socket完成的

socketserver代碼格式:

服務端:

import socketserver     # 引入模塊
import time


# 類名隨便定義,但是必須繼承socketserver.BaseRequestHandler此類。
class Myserver(socketserver.BaseRequestHandler):

    def handle(self):           # handle方法,固定名字
        conn = self.request     # conn相當于每個客戶端連接過來的,客戶端信息
        '''
        以下就是基于conn客戶端信息,對每個客戶端鏈接到服務端必須做的操作
        conn——>等于客戶端的連接信息
        以此實現(xiàn)并發(fā)連接
        '''
        while True:
            try:
                content = conn.recv(1024).decode('utf-8')
                conn.send(content.upper().encode('utf-8'))
                time.sleep(1)
            except ConnectionResetError:
                break


# 對 socketserver.ThreadingTCPServer 類實例化對象,將IP地址,端口號,以及自己定義的類名傳入,并返回一個對象
server = socketserver.ThreadingTCPServer(('127.0.0.1', 4444), Myserver)
server.serve_forever()      # 執(zhí)行對象server_forever方法,開啟服務端

客戶端:

import socket

sk = socket.socket()
sk.connect(('127.0.0.1', 4444))

while True:
    sk.send(b'heelo')
    content = sk.recv(1024).decode('utf-8')
    print(content)

二、驗證客戶端合法性

在分布式系統(tǒng)中實現(xiàn)一個簡單的客戶端鏈接認證功能,又不像SSL那么復雜,那么利用hmac+加鹽的方法實現(xiàn)。

思路:

服務端發(fā)送隨機字符串(并用客戶端和服務端都知道的秘鑰對隨機字符串進行加密)——>客戶端接收到服務端發(fā)送的隨機字符串(并用相同的秘鑰進行加密發(fā)送回服務端)——>服務端接收到客戶端發(fā)送的加密字符串和自己加密的字符串做對比(如果一致,就是合法客戶端,不一致,就立即關閉)

使用hashlib方法:

服務端

import socket
import hashlib
import os

# 設置雙方都擁有的秘鑰
secret = '秘鑰'.encode('utf-8')

sk = socket.socket()
sk.bind(('127.0.0.1', 4444))

sk.listen()
conn, _ = sk.accept()

# 給服務端發(fā)送32位隨機字節(jié)串
count = os.urandom(32)
conn.send(count)

# 并對字節(jié)串進行加鹽加密
hs = hashlib.sha1(secret)
hs.update(count)
info_server = hs.hexdigest()

# 接收客戶端發(fā)送的對字節(jié)串加密后的信息
info_client = conn.recv(1024).decode('utf-8')

# 客戶端加密后的信息和服務端加密后的信息做對比
if info_server == info_client:
    # 相等則連接合法,繼續(xù)操作
    print('合法連接')
else:
    # 不相等則斷開鏈接
    print('非合法用戶')
    conn.close()

客戶端

import socket
import hashlib

# 雙方共有的秘鑰
secret = '秘鑰'.encode('utf-8')

sk = socket.socket()
sk.connect(('127.0.0.1', 4444))

# 接收服務端發(fā)送的隨機字節(jié)
count = sk.recv(1024)

# 對隨機字節(jié)進行加密
hs = hashlib.sha1(secret)
hs.update(count)
info = hs.hexdigest().encode('utf-8')

# 把加密后的字節(jié)發(fā)送回服務端做判斷
sk.send(info)

以上就是關于“python如何實現(xiàn)并發(fā)和驗證客戶端的合法性”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關的知識內(nèi)容,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI