使用现有密码将客户导入magento

时间:2013-01-10 21:44:48

标签: magento csv import passwords

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

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

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

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

示例密码如下:

c957d358c8a79e66af10086b53b5a069:AuHg2mCXUhViqKYCLtFco22rmUCDwIFI

下面提供的答案部分解决了我的问题。应用此功能可以让我的virtmart客户登录,但会导致管理员登录问题,并迫使新用户使用virtuemart密码哈希格式。

我现在需要以检查核心哈希方法的方式对其进行修改,如果失败,则检查以及允许两种密码格式登录的virtmart哈希方法。

我正在思考

的内容
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技能是非常基本的一面,所以如果有人可以解释我在哪里出错,或者如果有更好的方法去解决它。

感谢。

1 个答案:

答案 0 :(得分:1)

这完全取决于算法在virtmart中的运作方式。快速谷歌之后,似乎需要用户提供的密码并将盐(分号后的部分)追加到最后,然后md5的值,它与密码哈希(半部分之前的部分)进行比较-colon在数据库中)。

与之相反,Magent在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];