服務端**:
from socket import
*import hmac, os
secret_key = b'123456io p'
defconn_auth
(conn)
:'''
認證客戶端鏈結
:param conn:
:return:
'''print
('開始驗證新鏈結的合法性'
) msg = os.urandom(32)
#產生32位隨機數
conn.sendall(msg)
#傳送給客戶端
h = hmac.new(secret_key, msg)
#雜湊驗證
digest = h.digest(
)#得到數字形式
respone = conn.recv(
len(digest)
)#客戶端回應的訊息
return hmac.compare_digest(respone, digest)
#比較兩個數字是否一樣
defdata_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())
defserver_handler
(ip_port, bufsize, backlog=5)
:'''
只處理鏈結
:param ip_port:
:param bufsize:
:param backlog:
: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'
,8000
) bufsize =
1024
server_handler(ip_port, bufsize)
合法客戶端**:
from socket import
*import hmac, os
secret_key = b'123456io p'
defconn_auth
(conn)
:'''
驗證客戶端到伺服器的鏈結
:param conn:
:return:
'''msg = conn.recv(32)
#收32個位元組(服務端傳送的訊息)
h = hmac.new(secret_key, msg)
digest = h.digest(
) conn.sendall(digest)
defclient_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()if
not 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'
,8000
) bufsize =
1024
client_handler(ip_port, bufsize)
執行結果:
不合法客戶端**(不知道加密方式):
from socket import
*def
client_handler
(ip_port, bufsize=
1024):
tcp_socket_client = socket(af_inet, sock_stream)
tcp_socket_client.connect(ip_port)
while
true
: data =
input
('>>:'
).strip()if
not 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'
,8000
) bufsize =
1024
client_handler(ip_port, bufsize)
執行結果: 認證客戶端的鏈結合法性
摘自 如果你想在分布式系統中實現乙個簡單的客戶端鏈結認證功能,又不像ssl那麼複雜,那麼利用hmac 加鹽的方式來實現 server.py coding utf 8 author linhaifeng from socket import import hmac,os secret key b li...
CAS客戶端認證流程
step 1 瀏覽器向cas客戶端發起登陸請求,cas客戶端生成 登陸url 並把瀏覽器重定向到該url 登陸url https cas server login?service 其中 cas server host cas認證伺服器的網域名稱 cas server port cas認證伺服器的ip...
關於客戶端和 android OAuth認證方法
1 編寫微博的客戶端 最重要的就是使用者授權方法,現在主流的sns 社群開發api 後,基本都採用oauth認證進行授權,2 在分享過程中不可避免的會考慮到使用者的賬戶的安全性的問題,第三方程式不應該直接接觸使用者的賬戶的資訊,但是沒有賬戶資訊,但是沒有賬戶資訊,又如何取得sns 平台的資料呢,oa...