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

使用现有密码将客户导入magento,magento,csv,import,passwords,Magento,Csv,Import,Passwords,我正在将15000名用户从virtuemart导入magento,但无法获得正确导入的密码 我的问题是密码的散列方式不同 Virtuemart HASH=md5($password.$salt) Magento HASH=md5($salt.$password) 密码示例如下所示: c957d358c8a79e66af10086b53b5a069:AuHg2mCXUhViqKYCLtFco22rmUCDwIFI 下面提供的答案部分解决了我的问题。应用此选项允许我的virtuemart客户登录,

我正在将15000名用户从virtuemart导入magento,但无法获得正确导入的密码

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

Virtuemart HASH=md5($password.$salt)

Magento HASH=md5($salt.$password)

密码示例如下所示:

c957d358c8a79e66af10086b53b5a069:AuHg2mCXUhViqKYCLtFco22rmUCDwIFI
下面提供的答案部分解决了我的问题。应用此选项允许我的virtuemart客户登录,但会导致管理员登录出现问题,并强制新用户使用virtuemart密码哈希格式

我现在需要修改它,检查核心散列方法,如果失败,则检查允许两种密码格式登录的virtuemart散列方法

我在想一些关于

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;
}

但是正如你可能知道的那样,这不起作用,因为我没有办法检查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技能是非常基本的,所以如果有人能解释一下我在这方面出了什么问题,或者有没有更好的方法


谢谢。

这完全取决于算法在virtuemart中的工作方式。在快速的谷歌搜索之后,它似乎接受了用户提供的密码,并将salt(分号后的部分)添加到末尾,然后md5的值与密码哈希(数据库中分号前的部分)进行比较

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

长话短说,应该通过编辑
Mage\u Core\u Model\u Encryption::validateHash
来实现快速获胜,这样,如果
$hashArr
的计数为2,它将附加哈希,而不是预结束

// replace
return $this->hash($hashArr[1] . $password) === $hashArr[0];
// with
return $this->hash($password . $hashArr[1]) === $hashArr[0];

这完全取决于算法在virtuemart中的工作方式。在快速的谷歌搜索之后,它似乎接受了用户提供的密码,并将salt(分号后的部分)添加到末尾,然后md5的值与密码哈希(数据库中分号前的部分)进行比较

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

长话短说,应该通过编辑
Mage\u Core\u Model\u Encryption::validateHash
来实现快速获胜,这样,如果
$hashArr
的计数为2,它将附加哈希,而不是预结束

// replace
return $this->hash($hashArr[1] . $password) === $hashArr[0];
// with
return $this->hash($password . $hashArr[1]) === $hashArr[0];

谢谢,它很有效!!在进行更改后,我可以使用导入的密码登录。明亮的唯一的缺点当然是,在恢复核心文件后,我无法再次登录,因此这将是一个永久性的黑客攻击。并不是说我反对它,如果有的话,那可能是我唯一的选择。理想情况下,虽然我正在寻找一个解决方案,将我的密码转换为默认的magento格式。我认为最好的方法是使用您的方法导入密码,然后在数据库中运行sql查询。在研究了更多内容之后,我对现在发生的事情有了更好的理解,并且完全理解了上面的代码。所以joomla对密码进行散列,比如So HASH=md5($password.$salt);而magento正在做相反的HASH=md5($salt.$password);知道了!有没有办法将散列转换成magentos的思维方式,或者散列后它是不可逆的?我想补充的另一点是magento应该同时支持盐密码和非盐密码,至少wiki页面上是这么说的,我假设在冒号后去掉盐分部分会将其转换为普通的未加盐md5,但事实并非如此。你可能应该研究什么是哈希。只有在客户登录时,您才能转换哈希值,但是如果您是从零开始,只有virtuemart客户,那么这就没有多大意义了。Magento确实支持无盐密码,它只是在冒号后存储一个空字符串。不过,您的密码哈希是用salt创建的,因此如果您删除了salt,您将无法验证哈希。您好,Cags,谢谢您的回复。保留joomla杂烩不会引起问题吗?例如,新用户将使用相同的哈希格式生成,magento更新可能会导致问题,等等。我还注意到管理员无法登录,核心黑客已经就位。这对我来说是全新的,我以前从未看过加密方法,所以这是第一次。如果您能提供任何建议或阅读任何材料,我们将不胜感激。谢谢,它很有效!!在进行更改后,我可以使用导入的密码登录。明亮的唯一的缺点当然是,在恢复核心文件后,我无法再次登录,因此这将是一个永久性的黑客攻击。并不是说我反对它,如果有的话,那可能是我唯一的选择。理想情况下,虽然我正在寻找一个解决方案,将我的密码转换为默认的magento格式。我认为最好的方法是使用您的方法导入密码,然后在数据库中运行sql查询。在研究了更多内容之后,我对现在发生的事情有了更好的理解,并且完全理解了上面的代码。所以joomla对密码进行散列,比如So HASH=md5($password.$salt);而magento正在做相反的HASH=md5($salt.$password);知道了!有没有办法将散列转换成magentos的思维方式,或者散列后它是不可逆的?我想补充的另一点是magento应该同时支持盐密码和非盐密码,至少wiki页面上是这么说的,我假设在冒号后去掉盐分部分会将其转换为普通的未加盐md5,但事实并非如此。你可能应该研究什么是哈希。唯一一次你可以转换