1

15000 人のユーザーを Virtuemart から Magento にインポートしていますが、正しくインポートするためのパスワードを取得できませんでした。

私の問題は、パスワードのハッシュが異なることです。

Virtuemart HASH = md5($password.$salt);

マジェント ハッシュ = 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];
        }
    }
}

if ステートメントを含めるように validatehash 関数を変更しましたが、これは認識されないようです。私のphpスキルは非常に基本的なものですので、誰かがこれのどこが間違っているのか、またはもっと良い方法があるのか​​ を説明してください.

ありがとう。

4

1 に答える 1

1

それはすべて、アルゴリズムが美徳マートでどのように機能するかによって異なります。簡単なグーグルの後、ユーザーが提供したパスワードを取得し、ソルト(セミコロンの後の部分)を最後に追加し、md5の値をパスワードハッシュ(セミコロンの前の部分)と比較するようです-データベースのコロン)。

それとは対照的に、Magento はパスワードの末尾ではなく、md5 ハッシュの前にソルトをパスワードの先頭に追加します。

簡単に言うと、カウントが 2 の場合、先頭に追加するのではなく、ハッシュを追加するMage_Core_Model_Encryption::validateHashように編集することで、迅速な勝利を達成できるはずです。$hashArr

// replace
return $this->hash($hashArr[1] . $password) === $hashArr[0];
// with
return $this->hash($password . $hashArr[1]) === $hashArr[0];
于 2013-01-11T09:07:30.880 に答える