【问题标题】:Importing customers into magento with existing passwords使用现有密码将客户导入 magento
【发布时间】:2013-01-10 21:44:47
【问题描述】:

我正在将 15000 个用户从 mercurymart 导入到 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 技能处于非常基础的方面,所以如果有人能解释一下我哪里出了问题,或者是否有更好的方法来解决它。

谢谢。

【问题讨论】:

    标签: magento csv import passwords


    【解决方案1】:

    这完全取决于算法在 mercurial 中的工作方式。在快速谷歌之后,它似乎需要用户提供的密码并将盐(分号后的部分)附加到末尾,然后是 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];
    

    【讨论】:

    • 谢谢,它有效!进行更改后,我可以使用导入的密码登录。杰出的。当然,唯一的缺点是在恢复核心文件后我无法再次登录,所以这必须是一个永久性的黑客攻击。不是我反对它,如果有的话,它可能是我唯一的选择。理想情况下,尽管我正在寻找一种将我的密码转换为默认 magento 格式的解决方案。我认为最好的方法是使用您的方法导入密码,然后在数据库中运行 sql 查询。
    • 在研究了更多之后,我对现在发生的事情有了更好的理解,并且完全理解了上面的代码。所以 joomla 正在像这样散列密码 HASH = md5($password.$salt);而 magento 则相反 HASH = md5($salt.$password);知道了 !无论如何将散列转换为 magentos 的思维方式,还是一旦散列就不可逆转?
    • 我想补充的另一点是,magento 应该同时支持加盐和不加盐的密码,至少它在 wiki 页面 magentocommerce.com/wiki/doc/webservices-api/api/customer 上是这么说的它是普通的无盐 md5,但这似乎不是这样。
    • 你应该研究一下什么是哈希。唯一能够转换哈希的时间是客户登录时,但如果您是从零开始,只有 mercurialmart 客户,那真的没有多大意义。 Magento 确实支持无盐密码,它只是在冒号后存储一个空字符串。不过,您的密码哈希是使用盐创建的,因此如果您删除盐,您将无法验证哈希。
    • 嗨,Cags,感谢您的回复。保持 joomla 哈希不会导致问题吗?例如,新用户将使用相同的哈希格式生成,magento 更新可能会导致问题等。我还注意到管理员无法在核心黑客到位的情况下登录。这对我来说是全新的,我以前从未看过加密方法,所以这是第一次。您可以提供任何建议或阅读材料,我们将不胜感激。
    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多