【问题标题】:How to verify a password against MediaWiki user table hashed password?如何根据 MediaWiki 用户表哈希密码验证密码?
【发布时间】:2012-11-05 11:10:39
【问题描述】:

我正在尝试将我的聊天应用程序登录名与我的 MediaWiki 登录名结合起来。聊天应用程序有一种奇怪的身份验证方式,我已对其进行了修改以与数据库一起使用。

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

我试过了:

hash('md5', $password);

但还有更多我想不通的地方。

【问题讨论】:

  • 你看过媒体维基源代码吗?
  • 是的,但我找不到加密功能
  • 这不是加密,而是散列。有很大的不同。请停止将散列称为“加密”。
  • @Jack Eeeeek,他们正在使用通用哈希函数。

标签: php hash passwords mediawiki


【解决方案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.";
}

支持 Jack 用this link 对 mediawiki 文档的问题发表评论。

【讨论】:

  • 这很有帮助,我现在正在尝试实现它。当我查询密码时,密码会在数据库中存储为“微小的 blob”,它会得到哈希值还是一些二进制文件?
  • 击败我。如有必要,请在结果集上尝试 var_dump() 和 try this 进行转换。
  • 我只是echo 的结果,他们是正常的谢谢你的帮助
【解决方案2】:

如果相信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 是提供的用于验证的密码。

【讨论】:

  • “哎呀,对不起。”可能是因为密码格式无效或密码错误。
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多