2012-11-16 112 views
1

我想将我的聊天应用程序登录和我的MediaWiki登录结合起来。聊天应用程序有一种奇怪的身份验证方式,我已将其修改为使用数据库。如何根据MediaWiki用户表验证密码散列密码?

我想将用户在聊天登录时输入的密码与保存在MediaWiki用户表中的密码进行匹配,但我无法弄清楚MediaWiki如何哈希密码。我知道我正在使用默认的盐渍散列。有没有人有一个功能,可以重新创建?

我曾尝试:

hash('md5', $password); 

,但还有更多的它,我想不通。

+0

你看过媒体wiki的源代码吗? – jordanm

+0

是的,但我无法找到加密功能 – arrowill12

+1

http://www.mediawiki.org/wiki/Manual_talk:User_table –

回答

1

这都是直把我的头顶部,但:

<?php 
//let's pretend these were entered by the user trying to authenticate 
$username = 'ted'; 
$password = 'password'; 

//PDO-like syntax. I wrote my own class around it and I don't remember how to do it raw. 
$query = "SELECT pw_hash FROM user_table WHERE username = ?"; 
$rs = $dbh->doQuery($query, array($username)); 
if(count($rs) == 0) { throw new Exception('no user'); } 

//will be either 
//:A:5f4dcc3b5aa765d61d8327deb882cf99 
//:B:838c83e1:e4ab7024509eef084cdabd03d8b2972c 

$parts = explode(':', $rs[0]['pw_hash']); 
print_r($parts); //$parts[0] will be blank because of leading ':' 

switch($parts[1]) { 
    case 'A': 
     $given_hash = md5($password); 
     $stored_hash = $parts[2]; 
     break; 
    case 'B': 
     $given_hash = md5($parts[2] . md5($password)); 
     $stored_hash = $parts[3]; 
     break; 
    default: 
     throw new Exception('Unknown hash type'); 
     break; 
} 

if($given_hash === $stored_hash) { 
    echo "login was succesful."; 
} else { 
    echo "login failed."; 
} 

道具杰克的问题与this link到MediaWiki文档注释。

+0

这是非常有帮助的,我现在试图实现它。当我查询密码时,密码会作为“小块”存储在数据库中,它会得到哈希还是一些二进制文件? – arrowill12

+0

打我。在结果集上尝试'var_dump()'并[试试这个](http://stackoverflow.com/questions/948174/how-do-i-convert-from-blob-to-text-in-mysql)到必要时转换。 – Sammitch

+0

我只是'回声'的结果,他们正常感谢您的帮助 – arrowill12

1

如果this wiki page是可以相信,以验证对存储数据库值的密码,你可以这样做:

list($dummy, $type, $salt, $hash) = explode(':', $db_password); 

$pwd_hash = md5($user_password); 
if ($type == 'B' && md5("$salt-$pwd_hash") === $hash) { 
    // yay success, type B 
} elseif ($type == 'A' && $salt === $pwd_hash) { 
    // yay success, type A 
} else { 
    // password is wrong or stored password is in an unknown format 
} 

假设$db_password是数据库的价值和$user_password是提供密码,以验证反对。

+0

“哎呀,对不起。”可能是因为密码格式无效或密码错误。 – NullUserException

+0

@NullUserException是的,好点。更新。 –