我将从virtmart导入15000个用户到magento,但无法正确导入密码。
我的问题是密码的散列方式不同。
Virtuemart HASH = md5($ password。$ salt);
Magento HASH = md5($ salt。$ password);
示例密码如下:
c957d358c8a79e66af10086b53b5a069:AuHg2mCXUhViqKYCLtFco22rmUCDwIFI
下面提供的答案部分解决了我的问题。应用此功能可以让我的virtmart客户登录,但会导致管理员登录问题,并迫使新用户使用virtuemart密码哈希格式。
我现在需要以检查核心哈希方法的方式对其进行修改,如果失败,则检查以及允许两种密码格式登录的virtmart哈希方法。
我正在思考
的内容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技能是非常基本的一面,所以如果有人可以解释我在哪里出错,或者如果有更好的方法去解决它。
感谢。
答案 0 :(得分:1)
这完全取决于算法在virtmart中的运作方式。快速谷歌之后,似乎需要用户提供的密码并将盐(分号后的部分)追加到最后,然后md5的值,它与密码哈希(半部分之前的部分)进行比较-colon在数据库中)。
与之相反,Magent在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];