Python正在加密从PHP生成的Salt并存储在Mysql中

时间:2013-06-12 21:47:41

标签: php python python-2.7 vbulletin

我正在导出,通过使用http请求抓取它,因为主机不会给我数据库访问,论坛并将其导入到vbulletin的mysql数据库中。

在vbulletin中,用户拥有唯一的密码盐,并使用此算法生成密码哈希值:

$hash = md5(md5($plaintext) . $salt);

我正在使用python脚本从我的sqlite数据库中读取用户信息的存储数据,为用户生成新密码和salt,然后将该数据存储到mysql数据库中,以便vbulletin可以使用它。

我的问题是python正在以意想不到的方式改变字符串的值。我正在使用已知密码和盐来测试我的脚本来比较哈希值。但是,我正在使用的盐是:

D(A\3*w/lo6Coo\Mc,H!0!2Z3d@O&R

当我尝试将其存储在python中时,当我检索字符串时,我得到了这个:

D(A\x03*w/lo6Coo\\Mc,H!0!2Z3d@O&R

这是我用来模仿vbulletin哈希算法的python代码:

salt = 'D(A\3*w/lo6Coo\Mc,H!0!2Z3d@O&R'

password = hashlib.md5()
password.update('*snipped password*')
password = password.hexdigest()

password_hash = hashlib.md5()
password_hash.update(password + salt)
password_hash = password_hash.hexdigest()

为了比较,这个PHP匹配vbulletin存储为数据库中的密码哈希:

$plaintext = '*snipped password*';
$salt = 'D(A\3*w/lo6Coo\Mc,H!0!2Z3d@O&R';

$hash = md5(md5($plaintext) . $salt);

$ hash匹配vbulletin存储的内容,而password_hash不匹配。我做错了什么导致差异?

2 个答案:

答案 0 :(得分:2)

您定义salt的方式就是问题所在。你必须要么把它变成原始字符串:

salt = r'D(A\3*w/lo6Coo\Mc,H!0!2Z3d@O&R'

或者逃避反斜杠:

salt = 'D(A\\3*w/lo6Coo\\Mc,H!0!2Z3d@O&R'

否则,\3被解释为字符代码为3的字符的转义序列。

另外,为了便于阅读,您可能需要创建md5函数:

def md5(text):
    return hashlib.md5(text).hexdigest()

hash = md5(md5(plaintext) + salt)

答案 1 :(得分:0)

对于今天使用此解决方案的人,请勿使用 md5 来存储散列密码。