Python hashlib.md5和ejabberd

时间:2011-02-21 15:34:44

标签: python ejabberd

我在ejabberd 2.1.6中使用python脚本作为外部auth选项。

我想开始加密验证验证中遇到的明文密码,以便它们不会以纯文本形式存储在后端数据库中。当我将以下代码添加到我的python脚本并重新启动ejabberd时,它会挂起:

import hashlib

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

hashlib是否需要运行特定的权限?

当我以普通用户(ejabberd)运行时,它可以正常工作。当python脚本在ejabberd的外部auth中运行时,它会挂起。

我试图让它写出'hash'到一个文件,它永远不会到达那里......如果我把它作为'ejabberd'用户运行,它写出文件就好了。

我试图找到有关在ubuntu上使用此库的限制的信息,但没有任何成功。有什么想法吗?

-sd

** 22.02.2011:以下是改编自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 个答案:

答案 0 :(得分:1)

我查看了hashlib source,虽然它似乎不需要太多,但它确实将.so文件作为模块导入,其中一个命中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
在违规行之前的代码中以及之后的一些trace语句

(在您的代码中更新了相应的路径)。尝试使用_hashlib而不是_md5(hashlib默认为包含openssl的_hashlib,但如果它没有加载或没有所需的哈希,则会回退到_md5,_sha等)。如果不是导入失败/挂起,那么你可以尝试调用_md5.new(salt + clear)和_hashlib.openssl_md5(salt + clear)并查看它是否是其中之一。

如果是导入错误,那么可能会解决类似的问题here 我不知道ejabberd,所以我不能将他们的解决方案与你的问题联系起来。不幸的是。

我必须说出来,但是:在我知道的所有python实现中,=而不是在条件中的==会引发一个SyntaxError,那就是 - 程序永远不会进入主while循环。

答案 1 :(得分:1)

我一直在搞乱同样的问题。我无法真正追踪_hashlib中openssl binings的问题。无论问题是什么,我将不得不修补python发布源。不是真正可行的解决方案。所以我最终使用了一个pycrypto包装器,用于加密函数,在这种情况下不会阻塞。

pip install pycrypto
from Crypto.Hash import MD5
m = MD5.new()
m.update("%s%s" % (salt ,clear))
h.hexdigest()

答案 2 :(得分:0)

hashlib不需要任何特殊的东西。什么意思挂?它挂在哪里?使用pdb.set_trace()来执行代码或使用'strace'或'ltrace'来调查API调用。

答案 3 :(得分:-1)

尝试使用logging模块,它可以帮助您查看输入和输出数据,还可以检查脚本权限,让用户执行ejabberd,或者只调试chmod 777 external.py }。