摘自:
如果你想在分布式系統中實現乙個簡單的客戶端鏈結認證功能,又不像ssl那麼複雜,那麼利用hmac+加鹽的方式來實現
server.py
#_*_coding:utf-8_*_
__author__ = '
linhaifeng
'from socket import *
import
hmac,os
secret_key=b'
linhaifeng bang bang bang
'def
conn_auth(conn):
'''認證客戶端鏈結
:param conn:
:return:
'''print('
開始驗證新鏈結的合法性')
msg=os.urandom(32) # 隨機產生乙個32位的金鑰
conn.sendall(msg)
h=hmac.new(secret_key,msg) # hmac類似於md5,這裡是加鹽的方式
digest=h.digest()
respone=conn.recv(len(digest))
return
hmac.compare_digest(respone,digest)
def data_handler(conn,bufsize=1024):
ifnot
conn_auth(conn):
print('
該鏈結不合法,關閉')
conn.close()
return
print('
鏈結合法,開始通訊')
while
true:
data=conn.recv(bufsize)
ifnot data:break
conn.sendall(data.upper())
def server_handler(ip_port,bufsize,backlog=5):
'''只處理鏈結
:param ip_port:
:return:
'''tcp_socket_server=socket(af_inet,sock_stream)
tcp_socket_server.bind(ip_port)
tcp_socket_server.listen(backlog)
while
true:
conn,addr=tcp_socket_server.accept()
print('
新連線[%s:%s]
' %(addr[0],addr[1]))
data_handler(conn,bufsize)
if__name__ == '
__main__':
ip_port=('
127.0.0.1
',9999)
bufsize=1024server_handler(ip_port,bufsize)
client.py
#_*_coding:utf-8_*_
__author__ = '
linhaifeng
'from socket import *
import
hmac,os
secret_key=b'
linhaifeng bang bang bang
'def
conn_auth(conn):
'''驗證客戶端到伺服器的鏈結
:param conn:
:return:
'''msg=conn.recv(32)
h=hmac.new(secret_key,msg)
digest=h.digest()
conn.sendall(digest)
def client_handler(ip_port,bufsize=1024):
tcp_socket_client=socket(af_inet,sock_stream)
tcp_socket_client.connect(ip_port)
conn_auth(tcp_socket_client)
while
true:
data=input('
>>:
').strip()
ifnot data:continue
if data == '
quit
':break
tcp_socket_client.sendall(data.encode(
'utf-8'))
respone=tcp_socket_client.recv(bufsize)
print(respone.decode('
utf-8'))
tcp_socket_client.close()
if__name__ == '
__main__':
ip_port=('
127.0.0.1
',9999)
bufsize=1024client_handler(ip_port,bufsize)
認證客戶端鏈結合法性(Python)
服務端 from socket import import hmac,os secret key b 123456io p defconn auth conn 認證客戶端鏈結 param conn return print 開始驗證新鏈結的合法性 msg os.urandom 32 產生32位隨機數...
python驗證客戶端的合法性
python驗證客戶端的合法性 client from socket import import hmac,os secret key b pengliang def conn auth conn 驗證客戶端到伺服器的鏈結 param conn return msg conn.recv 1 h hm...
粘包 阻塞與非阻塞 驗證客戶端的合法性
tcp協議傳輸資料存在粘包現象,udp協議不存在粘包協議。1.1.1 什麼是粘包現象 1.1.2 解決粘包問題 b.再傳送報文 2.自定義協議2 專門用來做檔案傳送的協議 三次握手的過程在 中是由accept和connect共同完成的,具體的細節再socket中沒有體現出來 2.四次揮手 2.1 i...