3

user:password @ hostを使用せずにxmlrpcサーバー(P2Pネットワークのノードで実行される)に認証を追加しようとしています。これにより、すべての攻撃者にパスワードが明らかになります。認証は、基本的にプライベートネットワークを作成し、許可されていないユーザーがそれにアクセスするのを防ぐためのものです。

これに対する私の解決策は、これに非常によく似たチャレンジレスポンスシステムを作成することでしたが、これをxmlrpcサーバーコードに追加する方法がわかりません。ここで同様の質問(カスタム認証が必要な場所)を見つけまし

そこで、クライアントがサーバーに接続するたびに呼び出されるモジュールを作成してみました。これは、クライアントで実行されているチャレンジレスポンスサーバーに接続し、クライアントが正しく応答した場合はTrueを返します。唯一の問題は、モジュールを1回しか呼び出せなかったため、reactorを再起動できないというエラーが発生したことです。では、「check()」関数が呼び出されるたびに接続してこれを実行するクラスを作成する方法はありますか?

最も簡単なことはSSLを使用して接続することでしょうか?それはパスワードを保護しますか?ただし、すべてのノードに対してSSL証明書を生成する必要がないようにしようとしているため、このソリューションは最適ではありません。

4

3 に答える 3

2

問題の説明に基づくと、Secure RemotePasswordProtocolが探しているもののようです。これはパスワードベースのメカニズムであり、SSL証明書管理の複雑さを伴わずに強力な相互認証を提供します。SSL証明書ほど柔軟ではないかもしれませんが、使いやすく理解しやすいです(完全なプロトコルの説明は1ページに収まります)。信頼できるサードパーティ(別名Kerberos / CA機関)が適切でない状況では、これが便利なツールであることがよくあります。

于 2012-06-28T22:25:32.397 に答える
2

独自の認証スキームを発明しないでください。すでに多くの優れたスキームがあり、発明にどのような脆弱性が存在するかについてセキュリティ調査を行う責任を負いたくありません。

HTTPには2つの非常に広くサポートされている認証メカニズムがあります(XML-RPCが実行されるため、XML-RPCに適用されます)。1つは「基本」で、もう1つは「ダイジェスト」です。SSLを介して実行する場合は、「基本」で問題ありません。本当にSSLを使用できない場合は、ダイジェストの方が適切です。

どちらも、豊富なドキュメントtwisted.web.guard.HTTPAuthSessionWrapperとともに、を介してTwistedWebでサポートされています。

于 2012-06-28T11:45:46.573 に答える
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 に答える