3

我正在尝试在不使用 user:password@host 的情况下向 xmlrpc 服务器(将在 P2P 网络的节点上运行)添加身份验证,因为这会将密码泄露给所有攻击者。身份验证基本上是创建一个专用网络,防止未经授权的用户访问它。

我对此的解决方案是创建一个与此非常相似的质询响应系统,但我不知道如何将其添加到 xmlrpc 服务器代码中。我在这里发现了一个类似的问题(需要自定义身份验证的地方)。

所以我尝试创建一个每当客户端连接到服务器时都会调用的模块。这将连接到客户端上运行的质询-响应服务器,如果客户端正确响应,则返回 True。唯一的问题是我只能调用该模块一次,然后我得到一个反应堆无法重新启动错误。那么是否有某种方法可以让一个类在调用“check()”函数时连接并执行此操作?

最简单的事情是使用 SSL 连接吗?那会保护密码吗?虽然这个解决方案不是最优的,因为我试图避免为所有节点生成 SSL 证书。

4

3 回答 3

2

根据您的问题描述,听起来您可能正在寻找安全远程密码协议。它是一种基于密码的机制,可提供强大的相互身份验证,而无需复杂的 SSL 证书管理。它可能不像 SSL 证书那样灵活,但它易于使用和理解(完整的协议描述适合单个页面)。我经常发现它在受信任的第三方(又名 Kerberos/CA 机构)不合适的情况下是一个有用的工具。

于 2012-06-28T22:25:32.397 回答
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)

一些有用的链接:

于 2012-06-29T18:38:20.597 回答
2

不要发明自己的身份验证方案。已经有很多很棒的方案,您不想负责对您的发明中存在哪些漏洞进行安全研究。

有两种被广泛支持的 HTTP 身份验证机制(XML-RPC 在其上运行,因此它们适用于 XML-RPC)。一个是“基本”,另一个是“摘要”。如果您决定通过 SSL 运行,“基本”就可以了。如果您真的不能使用 SSL,则 Digest 更合适。

两者都由 Twisted Web via 支持twisted.web.guard.HTTPAuthSessionWrapper,并带有大量文档

于 2012-06-28T11:45:46.573 回答