我刚注意到magento企业和社区两个版本都使用不同的算法来存储密码。我知道社区版使用md5。谁能告诉我企业版中使用了哪种机制?如果我们想迁移到社区版,我们如何解密企业密码?
答案 0 :(得分:13)
我认为它出现在Magento EE上的app/etc/local.xml
或app/etc/enterprise.xml
上
解密功能在Magento Enterprise Edition上
/**
* 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;
}
它似乎与企业版或社区版上的功能相同。 您应该将cript密钥问到 Magento Enterprise Edition的所有者并使用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.');
}
答案 1 :(得分:11)
哈希是单向加密。您不应该能够解密密码。
密码的基本操作:
客户注册一个帐户并输入密码。系统添加salt,加密密码并将生成的密码哈希存储在数据库中。
客户登录后输入密码。系统添加salt,加密密码并将生成的密码哈希与存储的密码哈希进行比较。当哈希值相等时,登录系统知道客户知道密码而不知道密码本身。
因此,如果一个系统使用SHA1而另一个系统使用旧的过期MD5,那么将密码重新输入系统的唯一方法是让客户重新输入密码,以便调用新的哈希算法并获得新的哈希值存储
您拥有企业源代码,编写一个使用企业散列函数来存储和比较密码的模块,并且您将使用CE更新的安全增强方法来存储密码,并且应该能够带来密码哈希值来自旧网站。
其他一些信息:
使用的加密方法可在Mage_Core_Model_Encryption类中找到。
感兴趣的三个功能是:
public function hash($data)
public function getHash($password, $salt = false)
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似乎都使用相同的例程,你需要检查一下,因为你有企业代码。
更改app / etc / local.xml文件中的加密密钥以匹配企业版中的密钥,然后将企业数据导入CE数据库,将允许访问加密数据。密码虽然存储为哈希(见上面的功能块),因此不可逆。 local.xml中存储加密密钥的相关部分:
<crypt>
<key>< ![CDATA[-encryption-key-here-]]></key>
</crypt>
答案 2 :(得分:5)
我们还使用不同的密码算法转移到另一个系统。我们所做的确实像Fiasco建议的那样:
- &GT;编写一个覆盖Magento_Core_Model_Encryption的自定义模块,并更改hash
函数以匹配加密密码的算法。
在你的模块配置中:
<global>
<helpers>
<core>
<encryption_model>MyCompany_Module_Model_Encryption</encryption_model>
</core>
</helpers>
</global>
答案 3 :(得分:3)
我过去成功地从Magento Enterprise迁移到Magento社区。如果密码被腌制,您将无法解密密码以将其用于Magento社区。 p>
您最好的选择是发送大量通讯,说人们必须更改密码或自动为每位客户生成密码并将其发送给他们。
答案 4 :(得分:2)
他们都应该使用MD5。
也许有人有盐,有人没有 - 但它会向后兼容。