我正在尝试将身份验证添加到xmlrpc服务器(将在P2P网络的节点上运行)而不使用user:password @ host,因为这将向所有攻击者显示密码。身份验证基本上是为了创建一个专用网络,防止未经授权的用户访问它。
我的解决方案是创建一个非常类似于this的质询响应系统,但我不知道如何将其添加到xmlrpc服务器代码中。 我发现了一个类似的问题(需要自定义身份验证的地方)here。
所以我尝试创建一个模块,只要客户端连接到服务器就会调用该模块。这将连接到在客户端上运行的质询 - 响应服务器,如果客户端正确响应将返回True。唯一的问题是我只能调用一次模块然后我得到一个反应堆无法重启错误。那么有一种方法可以让一个类在调用“check()”函数时它会连接并执行此操作吗?
最简单的事情是使用SSL进行连接吗?这会保护密码吗?虽然这个解决方案不是最佳的,因为我试图避免为所有节点生成SSL证书。
答案 0 :(得分:2)
不要发明自己的身份验证方案。已经有很多很棒的方案,你不想负责对你的发明中存在哪些漏洞进行安全研究。
HTTP有两种非常广泛支持的身份验证机制(运行XML-RPC,因此它们适用于XML-RPC)。一个是“基本”,另一个是“摘要”。如果您决定运行SSL,“基本”就可以了。如果你真的不能使用SSL,摘要更合适。
Twisted Web通过twisted.web.guard.HTTPAuthSessionWrapper
支持copious documentation。
答案 1 :(得分:2)
根据您的问题描述,听起来Secure Remote Password Protocol可能就是您正在寻找的内容。它是一种基于密码的机制,可提供强大的相互身份验证,而无需SSL证书管理的复杂性。它可能不像SSL证书那么灵活,但它易于使用和理解(完整的协议描述适合单个页面)。我经常发现它是一个有用的工具,适用于受信任的第三方(也称为Kerberos / CA权限)不合适的情况。
答案 2 :(得分: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)
一些有用的链接: