Python hashlib.md5和ejabberd

Python hashlib.md5和ejabberd,python,ejabberd,Python,Ejabberd,我在ejabberd 2.1.6中使用python脚本作为外部身份验证选项 我想开始加密身份验证中遇到的明文密码,这样它们就不会以明文形式存储在后端数据库中。当我将以下代码添加到python脚本并重新启动ejabberd时,它会挂起: import hashlib clear = "barfoo" salt = "foobar" hash = hashlib.md5( salt + clear ).hexdigest() hashlib是否需要特定的特权才能运行 当我以普通用户(ejabbe

我在ejabberd 2.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日:以下是改编自:


hashlib不需要任何特殊的东西。挂起是什么意思?它挂在哪里?使用pdb.set_trace()逐步遍历代码,或使用“strace”或“ltrace”调查API调用。

尝试使用
日志记录
模块,它可以帮助您查看输入和输出数据,还可以检查脚本权限,让用户执行
ejabberd
,或者对于调试,只需设置
chmod 777 external.py

,我查看了hashlib,虽然它似乎不需要太多,但它确实会导入。因此,文件作为模块,其中一个可以访问openssl。这一切看起来都很安全,但如果ejabberd试图阻止对第三方代码的调用(或者如果您运行了SELinux或其他类似的东西),那么事情可能会变得很奇怪。我在回复中得到了这个:

>>> 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
(将适当的路径更新为您的路径)在出现问题的行之前的代码中,然后使用一些跟踪语句。用_hashlib而不是_md5尝试同样的方法(hashlib默认为_hashlib,它包装openssl,但如果它没有加载或没有所需的哈希,它会返回到_md5、_sha等)。如果不是导入失败/挂起,那么您可以尝试调用_md5.new(salt+clear)和_hashlib.openssl_md5(salt+clear),看看它是否是其中之一

如果是导入错误,则可能解决了类似的问题 我不认识ejabberd,所以很遗憾,我无法将他们的解决方案与你的问题联系起来


不过,我不得不说:在我所知道的所有python实现中,=而不是==在某个条件下会引发语法错误,也就是说,程序甚至不会进入主while循环。

我一直在处理同样的问题。我真的无法在hashlib中找到openssl绑定的问题。无论问题是什么,我都必须修补python分发源代码。这不是一个切实可行的解决方案。因此,我最终为加密函数使用了pycrypto包装器,在本例中它不会阻塞

pip install pycrypto pip安装pycrypto 从Crypto.Hash导入MD5 m=MD5.new() m、 更新(“%s%s”%(盐,清除)) h、 hexdigest()
谢谢你,安德烈亚斯。我将查看pdb.set_trace()。。也许它可以把所有的东西都输出到一个文件中,给我更多的提示。在阅读了更多关于pdb的内容后,我意识到这是没有用的。当我以用户身份运行python脚本时,它没有任何问题。只有从ejabberd运行时才会出现此问题。更可能的情况是,由于ejabberd输出的格式没有像您希望的那样好,导致您的read语句挂起。我建议使用非阻塞IO。一个问题是上面粘贴的脚本包含一个输入错误:应该是
if(password==hash):return True
,因为在一个条件中不允许赋值。如果我因为缺少=而等待了3个月,我会发疯。我会查出来的!整个条件都可以写入
return password==hash
,因此尽管这是一个很好的反馈,但对于确定问题的根本原因并没有多大帮助。我怀疑问题是因为a=而不是a==那么_hashlib呢?另外,它在ejabberd中还是在常规python解释器中失败?在常规python解释器中失败。我今晚去查一下<代码>导入hashlib工作正常。。。 pip install pycrypto from Crypto.Hash import MD5 m = MD5.new() m.update("%s%s" % (salt ,clear)) h.hexdigest()