1

我正在将 15000 个用户从 mercurial 导入 magento,但无法正确导入密码。

我的问题是密码的散列方式不同。

Virtuemart HASH = md5($password.$salt);

Magento HASH = md5($salt.$password);

示例密码如下所示:

c957d358c8a79e66af10086b53b5a069:AuHg2mCXUhViqKYCLtFco22rmUCDwIFI

下面提供了一个答案,部分解决了我的问题。应用此设置允许我的美德玛客户登录,但会导致管理员登录出现问题并强制新用户使用美德玛密码哈希格式。

我现在需要对其进行修改,使其检查核心散列方法,如果失败,则检查允许两种密码格式登录的美德玛特散列方法。

我在想一些事情

public function getHash($password, $salt = false)
{
    if (is_integer($salt)) {
        $salt = $this->_helper->getRandomString($salt);
    }
    return $salt === false ? $this->hash($password) : $this->hash($password . $salt) . ':' . $salt : $this->hash($salt . $password) . ':' . $salt;
}

.

    public function validateHash($password, $hash)
{
    $hashArr = explode(':', $hash);
    switch (count($hashArr)) {
        case 1:
            // no hash
            return $this->hash($password) === $hash;
        case 2:
            // magento default hash
            return $this->hash($hashArr[1] . $password) === $hashArr[0];
        case 3:
            // virtuemart hash
            return $this->hash($password . $hashArr[1]) === $hashArr[0];        }
    Mage::throwException('Invalid hash.');
}

但是您可能会说这不起作用,因为我无法检查哈希类型方法。

请问我该怎么做?

更新 - 这是我的最新尝试。

public function validateHash($password, $hash)
{
    $hashArr = explode(':', $hash);
    if(admin_login_handling_and_api_user_accounts){
        switch (count($hashArr)) {
            case 1:
                return $this->hash($password) === $hash;
            case 2:
                return $this->hash($hashArr[1] . $password) === $hashArr[0];
        }
    } else if(Magento_customer_handling){
        switch (count($hashArr)) {
            case 1:
                return $this->hash($password) === $hash;
            case 2:
                    return $this->hash($password . $hashArr[1]) === $hashArr[0];
        }
    } else if(soap_Api_customer_handling){
        switch (count($hashArr)) {
            case 1:
                return $this->hash($password) === $hash;
            case 2:
                return $this->hash($hashArr[1] . $password) === $hashArr[0];
        }
    }
}

我已将 validatehash 函数更改为包含 if 语句,但这似乎没有被识别。我的 php 技能处于非常基础的方面,所以如果有人可以解释一下我哪里出了问题,或者是否有更好的方法来解决它。

谢谢。

4

1 回答 1

1

这一切都取决于算法在 mercurialt 中的工作方式。在快速谷歌之后,它似乎需要用户提供的密码并将盐(分号后的部分)附加到末尾,然后是 md5 的值,它与密码哈希(半前的部分)进行比较-数据库中的冒号)。

与此相反,Magento 在 md5 散列密码之前将盐添加到密码的开头,而不是结尾。

长话短说,应该通过编辑来实现快速获胜,Mage_Core_Model_Encryption::validateHash这样如果$hashArr计数为 2,它将附加散列,而不是前置。

// replace
return $this->hash($hashArr[1] . $password) === $hashArr[0];
// with
return $this->hash($password . $hashArr[1]) === $hashArr[0];
于 2013-01-11T09:07:30.880 回答