8

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

4

5 回答 5

12

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

密码的基本操作:

  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.xx 开始的功能代码

>

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>
于 2012-11-30T15:51:56.247 回答
10

我认为它在您的app/etc/local.xmlapp/etc/enterprise.xmlMagento EE 上

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

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

在评论 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.');
}
于 2012-12-20T03:24:15.567 回答
5

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

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

在您的模块配置中:

<global>
  <helpers>
    <core>
      <encryption_model>MyCompany_Module_Model_Encryption</encryption_model>
   </core>
 </helpers>
</global>
于 2012-12-19T14:04:44.800 回答
3

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

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

于 2012-12-24T07:32:42.003 回答
2

他们都应该使用 MD5。

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

于 2012-12-20T03:16:09.663 回答