2012-06-27 42 views
3

我正嘗試將身份驗證添加到xmlrpc服務器(將在P2P網絡的節點上運行),而不使用用戶:password @ host,因爲這會顯示密碼給所有的攻擊者。認證是基本上創建一個專用網絡,防止未經授權的用戶訪問它。如何將身份驗證添加到(Python)扭曲的xmlrpc服務器

我的解決方案是創建一個非常類似於this的質詢響應系統,但我不知道如何將其添加到xmlrpc服務器代碼。 我發現了一個類似的問題(需要定製認證)here

所以我試着創建一個模塊,只要客戶端連接到服務器就會被調用。這將連接到在客戶端上運行的質詢響應服務器,如果客戶端正確響應將返回True。唯一的問題是,我只能調用模塊一次,然後我有一個反應堆不能重新啓動錯誤。那麼有沒有什麼辦法可以讓一個類只要調用「check()」函數就可以連接並執行此操作?

最簡單的事情是使用SSL進行連接嗎?這會保護密碼嗎?雖然這個解決方案不會是最佳的,因爲我試圖避免必須爲所有節點生成SSL證書。

回答

2

對於任何正在尋找下面完整示例的人都是我的(感謝Rakis指引我朝着正確的方向)。在這裏,用戶和密碼存儲在一個名爲'passwd'的文件中(有關更多詳細信息以及如何更改,請參閱第一個有用的鏈接)。

服務器:

#!/usr/bin/env python 
import bjsonrpc 
from SRPSocket import SRPSocket 
import SocketServer 
from bjsonrpc.handlers import BaseHandler 
import time 

class handler(BaseHandler): 
    def time(self): 
     return time.time() 

class SecureServer(SRPSocket.SRPHost): 
    def auth_socket(self, socket): 
     server = bjsonrpc.server.Server(socket, handler_factory=handler) 
     server.serve() 

s = SocketServer.ForkingTCPServer(('', 1337), SecureServer) 
s.serve_forever() 

客戶:

#! /usr/bin/env python 
import bjsonrpc 
from bjsonrpc.handlers import BaseHandler 
from SRPSocket import SRPSocket 
import time 

class handler(BaseHandler): 
    def time(self): 
     return time.time() 

socket, key = SRPSocket.SRPSocket('localhost', 1337, 'dht', 'testpass') 

connection = bjsonrpc.connection.Connection(socket, handler_factory=handler) 

test = connection.call.time() 
print test 
time.sleep(1) 

一些有用的鏈接:

2

不要發明自己的認證方案。已經有很多優秀的計劃,並且您不希望對您的發明中存在哪些漏洞進行安全性研究負責。

HTTP有兩種非常廣泛支持的身份驗證機制(通過它運行XML-RPC,因此它們適用於XML-RPC)。一個是「基本」,另一個是「摘要」。如果您決定通過SSL運行,「基本」很好。如果您真的不能使用SSL,則摘要更合適。

兩者都支持Twisted Web通過twisted.web.guard.HTTPAuthSessionWrappercopious documentation

+0

唯一的問題是這些假設服務器是可信的。如果一個P2P節點意外地給了攻擊者的IP,那麼使用user:pass @ host會給他們登錄的詳細信息。我的身份驗證是相互的,因此也確保服務器知道密碼。 – bradleyjkemp

+0

摘要式身份驗證不會向服務器顯示明文密碼。但是,聽起來你使用SSL真的會更好。爲所有節點生成SSL證書確實不那麼困難,併爲您提供更強有力的保證。 –

+0

我想要做的是檢查我連接的節點是否有權成爲網絡的一部分。要在SSL中執行此操作,我需要一個證書頒發機構簽署所有證書,並且只信任那些證書。並行Python有一個類似於我嘗試創建的系統,但我不確定它是如何實現的。 – bradleyjkemp

2

根據您的問題描述,聽起來像Secure Remote Password Protocol可能是您正在尋找。這是一種基於密碼的機制,可提供強大的相互認證,而無需SSL證書管理的複雜性。它可能不像SSL證書那麼靈活,但易於使用和理解(完整的協議描述適合於單個頁面)。對於受信任的第三方(又名Kerberos/CA權威)不合適的情況,我經常發現它是一個有用的工具。

+0

感謝這正是我正在尋找的東西。你知道我怎麼把這個加到扭曲的?一個問題可能是XMLRPC是無狀態的,所以我可能不得不使用其他有狀態的協議。 – bradleyjkemp