Skip to main content
 首页 » 编程设计

Python hashlib.md5 和 ejabberd

2025年05月04日8www_RR

我在 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 上使用此库的限制的信息,但没有成功。有什么想法吗?

-标准差

** 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) 

请您参考如下方法:

我也遇到了同样的问题。我无法真正找到 _hashlib 中 openssl binings 的问题。无论问题是什么,我都必须修补 python 分发源。不是真正可行的解决方案。所以我最终使用了一个 pycrypto 包装器来实现在这种情况下不会阻塞的加密功能。

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