Python 實(shí)現(xiàn)簡單的客戶端認(rèn)證
問題
你想在分布式系統(tǒng)中實(shí)現(xiàn)一個(gè)簡單的客戶端連接認(rèn)證功能,又不想像SSL那樣的復(fù)雜。
解決方案
可以利用 hmac 模塊實(shí)現(xiàn)一個(gè)連接握手,從而實(shí)現(xiàn)一個(gè)簡單而高效的認(rèn)證過程。下面是代碼示例:
import hmac import os def client_authenticate(connection, secret_key): ''' Authenticate client to a remote service. connection represents a network connection. secret_key is a key known only to both client/server. ''' message = connection.recv(32) hash = hmac.new(secret_key, message) digest = hash.digest() connection.send(digest) def server_authenticate(connection, secret_key): ''' Request client authentication. ''' message = os.urandom(32) connection.send(message) hash = hmac.new(secret_key, message) digest = hash.digest() response = connection.recv(len(digest)) return hmac.compare_digest(digest,response)
基本原理是當(dāng)連接建立后,服務(wù)器給客戶端發(fā)送一個(gè)隨機(jī)的字節(jié)消息(這里例子中使用了 os.urandom() 返回值)。 客戶端和服務(wù)器同時(shí)利用hmac和一個(gè)只有雙方知道的密鑰來計(jì)算出一個(gè)加密哈希值。然后客戶端將它計(jì)算出的摘要發(fā)送給服務(wù)器, 服務(wù)器通過比較這個(gè)值和自己計(jì)算的是否一致來決定接受或拒絕連接。摘要的比較需要使用 hmac.compare_digest() 函數(shù)。 使用這個(gè)函數(shù)可以避免遭到時(shí)間分析攻擊,不要用簡單的比較操作符(==)。 為了使用這些函數(shù),你需要將它集成到已有的網(wǎng)絡(luò)或消息代碼中。例如,對于sockets,服務(wù)器代碼應(yīng)該類似下面:
from socket import socket, AF_INET, SOCK_STREAM
secret_key = b'peekaboo'
def echo_handler(client_sock):
if not server_authenticate(client_sock, secret_key):
client_sock.close()
return
while True:
msg = client_sock.recv(8192)
if not msg:
break
client_sock.sendall(msg)
def echo_server(address):
s = socket(AF_INET, SOCK_STREAM)
s.bind(address)
s.listen(5)
while True:
c,a = s.accept()
echo_handler(c)
echo_server(('', 18000))
Within a client, you would do this:
from socket import socket, AF_INET, SOCK_STREAM
secret_key = b'peekaboo'
s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost', 18000))
client_authenticate(s, secret_key)
s.send(b'Hello World')
resp = s.recv(1024)
討論
hmac 認(rèn)證的一個(gè)常見使用場景是內(nèi)部消息通信系統(tǒng)和進(jìn)程間通信。 例如,如果你編寫的系統(tǒng)涉及到一個(gè)集群中多個(gè)處理器之間的通信, 你可以使用本節(jié)方案來確保只有被允許的進(jìn)程之間才能彼此通信。 事實(shí)上,基于 hmac 的認(rèn)證被 multiprocessing 模塊使用來實(shí)現(xiàn)子進(jìn)程直接的通信。
還有一點(diǎn)需要強(qiáng)調(diào)的是連接認(rèn)證和加密是兩碼事。 認(rèn)證成功之后的通信消息是以明文形式發(fā)送的,任何人只要想監(jiān)聽這個(gè)連接線路都能看到消息(盡管雙方的密鑰不會被傳輸)。
hmac認(rèn)證算法基于哈希函數(shù)如MD5和SHA-1,關(guān)于這個(gè)在IETF RFC 2104中有詳細(xì)介紹。
以上就是Python 實(shí)現(xiàn)簡單的客戶端認(rèn)證的詳細(xì)內(nèi)容,更多關(guān)于Python 客戶端認(rèn)證的資料請關(guān)注腳本之家其它相關(guān)文章!
- PythonPC客戶端自動(dòng)化實(shí)現(xiàn)原理(pywinauto)
- python中的socket實(shí)現(xiàn)ftp客戶端和服務(wù)器收發(fā)文件及md5加密文件
- python mqtt 客戶端的實(shí)現(xiàn)代碼實(shí)例
- python使用多線程編寫tcp客戶端程序
- 基于Python的ModbusTCP客戶端實(shí)現(xiàn)詳解
- python實(shí)現(xiàn)websocket的客戶端壓力測試
- python3+PyQt5 創(chuàng)建多線程網(wǎng)絡(luò)應(yīng)用-TCP客戶端和TCP服務(wù)器實(shí)例
- Python一個(gè)簡單的通信程序(客戶端 服務(wù)器)
- python如何創(chuàng)建TCP服務(wù)端和客戶端
- python搭建服務(wù)器實(shí)現(xiàn)兩個(gè)Android客戶端間收發(fā)消息
相關(guān)文章
Python使用Pandas讀取CSV文件數(shù)據(jù)的操作方法
Pandas?是?Python?中一個(gè)強(qiáng)大的數(shù)據(jù)分析庫,它提供了大量的工具用于數(shù)據(jù)操作和分析,其中,read_csv?函數(shù)是?Pandas?中最常用的函數(shù)之一,用于從?CSV?文件中讀取數(shù)據(jù),本文將詳細(xì)介紹?read_csv?的基本用法,常見問題及其解決方案,并通過代碼案例進(jìn)行說明2024-12-12
Python爬取國外天氣預(yù)報(bào)網(wǎng)站的方法
這篇文章主要介紹了Python爬取國外天氣預(yù)報(bào)網(wǎng)站的方法,可實(shí)現(xiàn)抓取國外天氣預(yù)報(bào)信息的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
Python基于gevent實(shí)現(xiàn)文件字符串查找器
這篇文章主要介紹了Python基于gevent實(shí)現(xiàn)文件字符串查找器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
15個(gè)應(yīng)該掌握的Jupyter Notebook使用技巧(小結(jié))
這篇文章主要介紹了15個(gè)應(yīng)該掌握的Jupyter Notebook使用技巧(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python pandas自定義函數(shù)的使用方法示例
這篇文章主要介紹了Python pandas自定義函數(shù)的使用方法,結(jié)合實(shí)例形式分析了pandas模塊相關(guān)自定義函數(shù)數(shù)值運(yùn)算操作技巧,需要的朋友可以參考下2019-11-11
numpy庫與pandas庫axis=0,axis= 1軸的用法詳解
這篇文章主要介紹了numpy庫與pandas庫axis=0,axis= 1軸的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

