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