我正在导出,通过使用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不匹配。我做错了什么导致差异?
答案 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 来存储散列密码。