2012-06-27 43 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