【问题标题】:How to decrypt magento enterprise edition password?如何解密magento企业版密码?
【发布时间】:2012-11-30 10:43:19
【问题描述】:

我刚刚注意到 magento 企业版和社区版都使用不同的算法来存储密码。我知道社区版使用 md5。谁能告诉我企业版使用的是哪种机制,如果我们想迁移到社区版,我们如何解密企业密码?

【问题讨论】:

  • 这是您不只是重置所有密码并让客户在他们想登录时重置密码的原因吗?
  • 我有 5000 多个客户,我不想要求所有客户。
  • 这不是一个好主意。我正在寻找解决方案。
  • 不,它是一样的,但每个 Magento 的关键是不同的。检查您的 标签

标签: magento


【解决方案1】:

哈希是一种加密方式。您不应该能够解密密码。

密码的基本操作:

  1. 客户注册帐户并输入密码。系统添加盐,加密密码并将生成的密码哈希存储在数据库中。

  2. 客户登录,输入密码。系统添加盐,加密密码并将生成的密码哈希与存储的密码哈希进行比较。当哈希值相等时,登录系统知道客户知道密码,而实际上并不知道密码本身。

因此,如果一个系统使用 SHA1 而另一个系统使用旧的、过期的 MD5,则将密码重新输入系统的唯一方法是让客户重新输入密码,以便调用新的哈希算法并获得新的哈希存储。

您拥有 Enterprise 源代码,编写一个使用 Enterprise 散列函数来存储和比较密码的模块,您将拥有带有更新的、安全增强的方法来存储密码的 CE,并且应该能够带来密码散列从旧网站上移过来。

一些附加信息:

使用的加密方法可以在 Mage_Core_Model_Encryption 类中找到。

三个感兴趣的函数是:

  1. public function hash($data)
  2. public function getHash($password, $salt = false)
  3. public function validateHash($password, $hash)

来自 1.7.x.x 的功能代码

>

public function hash($data)
{
    return md5($data);
}

>

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

>

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

似乎 CE 和 Enterprise 都使用相同的例程,您必须检查一下,因为您有 Enterprise 代码

更改 app/etc/local.xml 文件中的加密密钥以匹配企业版本中的密钥,然后将企业数据导入 CE 数据库将允许访问加密数据。密码虽然存储为散列(参见上面的功能块)并且因此是不可逆的。 local.xml 中存储加密密钥的相关部分:

<crypt>
    <key>< ![CDATA[-encryption-key-here-]]></key>
</crypt>

【讨论】:

    【解决方案2】:

    我认为它在 Magento EE 上的 app/etc/local.xmlapp/etc/enterprise.xml

    Magento 企业版的解密功能

    /**
     * Decrypt a string
     *
     * @param string $data
     * @return string
     */
    public function decrypt($data)
    {
        return str_replace("\x0", '', trim($this->_getCrypt()->decrypt(base64_decode((string)$data))));
    }
    

    /**
     * Instantiate crypt model
     *
     * @param string $key
     * @return Varien_Crypt_Mcrypt
     */
    protected function _getCrypt($key = null)
    {
        if (!$this->_crypt) {
            if (null === $key) {
                $key = (string)Mage::getConfig()->getNode('global/crypt/key');
            }
            $this->_crypt = Varien_Crypt::factory()->init($key);
        }
        return $this->_crypt;
    }
    

    企业版社区版上的功能似乎相同。 您应该向 Magento Enterprise Edition's Owner 询问 cript 密钥并使用 CE 对其进行解密。没关系,因为我正在潜入 Magento Enterprise Edition 的代码,并且代码与 Community Edition 相同 (用于加密/解密)

    在评论 1 之后添加:

    /**
     * Hash a string
     *
     * @param string $data
     * @return string
     */
    public function hash($data)
    {
        return md5($data);
    }
    
    /**
     * Validate hash against hashing method (with or without salt)
     *
     * @param string $password
     * @param string $hash
     * @return bool
     * @throws Exception
     */
    public function validateHash($password, $hash)
    {
        $hashArr = explode(':', $hash);
        switch (count($hashArr)) {
            case 1:
                return $this->hash($password) === $hash;
            case 2:
                return $this->hash($hashArr[1] . $password) === $hashArr[0];
        }
        Mage::throwException('Invalid hash.');
    }
    

    【讨论】:

    • 这些是加密数据的解密例程,旨在通过使用 app/etc/local.xml 中的加密密钥进行恢复。密码存储在哈希中。请在您的企业代码中查找 public function hash($data) 并报告正在使用的哈希例程。有关 1.7.x.x CE 代码和用于处理密码的更多功能,请参阅我的帖子。
    • 感谢企业代码。好的,那么他们都在使用 MD5。 @fkim 在他的帖子中指出,Enterprise 可能会使用盐,而 CE 可能不会。我会把剩下的留给帕拉尼库马尔来决定怎么做。
    • 感谢您对 josua 和惨败圈的建议。
    • 这是一篇很老的帖子,但我只想提一下 Magento 1 EE 中的逻辑相同。 Mage_Core_Model_EncryptionEnterprise_Pci_Model_Encryption 覆盖,它覆盖了 hash() 方法,并具有 sha256md5 向后兼容的逻辑。
    【解决方案3】:

    我们还使用不同的密码算法迁移到了不同​​的系统。我们所做的确实像 Fiasco 所暗示的那样:

    -> 编写一个覆盖 Magento_Core_Model_Encryption 的自定义模块并更改 hash 函数以匹配加密密码的算法。

    在您的模块配置中:

    <global>
      <helpers>
        <core>
          <encryption_model>MyCompany_Module_Model_Encryption</encryption_model>
       </core>
     </helpers>
    </global>
    

    【讨论】:

    • 如您所见,覆盖Mage_Core_Model_Encryption 并修改public function hash($data) 以获得正确的哈希方法。
    【解决方案4】:

    我过去曾成功地从 Magento Enterprise 迁移到 Magento Community。如果密码被加盐,您将无法解密它们以用于 Magento 社区。​​p>

    您最好的选择是发送大量通讯,告知人们必须更改密码或自动为每个客户生成密码并将其发送给他们。

    【讨论】:

    • 您也无法解密未加盐的。哈希是不可逆的,只能被暴力破解。没有盐的存储使得使用彩虹表可用,但彩虹表是您与从密码存储数据库中提取的哈希进行比较以与表进行比较的哈希数据库。
    【解决方案5】:

    他们都应该使用 MD5。

    也许一个有盐,一个没有 - 但它会向后兼容。

    【讨论】:

    • base64_decode 是编码,而不是加密...查找密码哈希例程。您会在其中找到对盐的参考。
    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多