2

ejabberd2.1.6の外部認証オプションとしてPythonスクリプトを使用しています。

認証検証で検出されたクリアテキストのパスワードの暗号化を開始して、バックエンドデータベースにプレーンテキストで保存されないようにしたかったのです。次のコードをPythonスクリプトに追加して、ejabberdを再起動すると、ハングします。

import hashlib

clear = "barfoo"
salt = "foobar"
hash = hashlib.md5( salt + clear ).hexdigest()

hashlibを実行するには、特定の特権が必要ですか?

通常のユーザー(ejabberd)として実行すると、問題なく動作します。Pythonスクリプトをejabberdの外部認証内で実行すると、ハングします。

「ハッシュ」をファイルに書き出そうとしましたが、そこに到達することはありません...「ejabberd」ユーザーとして実行すると、ファイルに正常に書き出されます。

このライブラリをubuntuで使用する際の制限に関する情報を見つけようとしましたが、成功しませんでした。何か案は?

-SD

** 2011年2月22日: https://git.process-one.net/ejabberd/mainline/blobs/raw/2.1.x/doc/dev.html#htoc8から採用された完全なスクリプトは次のとおりです。

#!/usr/bin/python

import sys
from struct import *

import hashlib  

def from_ejabberd():
    input_length = sys.stdin.read(2)
    (size,) = unpack('>h', input_length)
    return sys.stdin.read(size).split(':')

def to_ejabberd(bool):
    answer = 0
    if bool:
        answer = 1
    token = pack('>hh', 2, answer)
    sys.stdout.write(token)
    sys.stdout.flush()

def auth(username, server, password):
    clear = "barfoo"
    salt = "foobar"
    hash = hashlib.md5( salt + clear ).hexdigest()
    if (password == hash): return True
    else: return False

def isuser(username, server):
    return True

def setpass(username, server, password):
    return True

while True:
    data = from_ejabberd()
    success = False
    if data[0] == "auth":
        success = auth(data[1], data[2], data[3])
    elif data[0] == "isuser":
        success = isuser(data[1], data[2])
    elif data[0] == "setpass":
        success = setpass(data[1], data[2], data[3])
    to_ejabberd(success)
4

4 に答える 4

1

hashlibソースを調べたところ、それほど多くは必要ないようですが、.soファイルをモジュールとしてインポートし、そのうちの1つがopensslにヒットします。それはすべてかなり安全に見えますが、ejabberdがサードパーティのコードへの呼び出しに対して自分自身をフェンスしようとすると(またはSELinuxまたはその効果のために何か他のものを実行している場合)、物事はおそらく奇妙になる可能性があります。私はREPLでこれを手に入れました:

>>> import _md5
>>> _md5.__file__
'/usr/lib/python2.7/lib-dynload/_md5module.so'

あなたの箱にこれを試してから、入れてみてください

_md5 = imp.load_dynamic('_md5', '/usr/lib/python2.7/lib-dynload/_md5module.so')

あるいは単に

import _md5

(適切なパスが更新された状態で)問題のある行の前のコードと、その後のトレースステートメント。_md5の代わりに_hashlibでも同じことを試してください(hashlibのデフォルトはopensslをラップする_hashlibですが、ロードされないか、必要なハッシュがない場合は、_md5、_shaなどにフォールバックします)。失敗/ハングするのがインポートではない場合は、_md5.new(salt + clear)および_hashlib.openssl_md5(salt + clear)を呼び出して、それらの1つであるかどうかを確認できます。

輸入に問題がある場合は、ここで同様の問題に取り組んだ可能性があります 。私はejabberdを知らないので、残念ながら、それらの解決策をあなたの問題に関連付けることはできません。

しかし、私はそれを言わなければなりません:私が知っているすべてのPython実装では、条件で==の代わりに=はSyntaxErrorを発生させ、それはそれです-プログラムはメインのwhileループにさえ入ることはありません。

于 2011-04-28T16:28:28.550 に答える
1

私は同じ問題をいじっています。_hashlibのopensslビニングの問題を実際に追跡することはできません。問題が何であれ、Pythonディストリビューションソースにパッチを適用する必要があります。実際には実行可能な解決策ではありません。そのため、この場合はブロックしない暗号関数にpycryptoラッパーを使用することになりました。

pip install pycrypto
Crypto.HashからMD5をインポートします
m = MD5.new()
m.update( "%s%s"%(salt、clear))
h.hexdigest()
于 2011-05-11T07:46:39.680 に答える
0

hashlibは特別なものを必要としません。ハングするとはどういう意味ですか?どこにぶら下がっていますか?pdb.set_trace()を使用してコードをステップスルーするか、「strace」または「ltrace」を使用してAPI呼び出しを調査します。

于 2011-02-21T16:36:37.183 に答える
-1

モジュールを使用してみてください。入力データと出力データを監視したり、スクリプトのアクセス許可を確認したり、ユーザーが実行できるようにしたり、デバッグ用に設定したりするのloggingに役立ちます。ejabberdchmod 777 external.py

于 2011-04-28T07:39:54.917 に答える