Перенос паролей с разным шифрованием (CubeCart в Prestashop)

Я перемещаю клиентов из CubeCart в Prestashop и хочу сохранить существующие пароли клиентов.

Я нашел статью на форумах Prestashop, которая, кажется, делает то, что мне нужно, но она предназначена для ZenCart / OScommerce и Prestashop. Поэтому в структуре пароля есть небольшая разница, с которой мне нужна помощь, см. Ниже:

ZC / OSC
Формат: 1 столбец, 32 буквенно-цифровых символа + двоеточие + 2 буквенно-цифровых символа соль.
Например,
e56d64755f66a86996b54114bb4102bf: 08

CC
Формат: 2 столбца, 32 буквенно-цифровых символа + отдельная 6-значная случайная соль.
Например,
пароль: e56d64755f66a86996b54114bb4102bf
salt: 7pZcAF

Поэтому мне бы хотелось, чтобы вам помогли адаптировать приведенный ниже код для работы с паролем / солью CC из 2 столбцов:

// == BEGIN ZEN-CART / OSCOMMERCE TO PRESTASHOP PASSWORD INTEGRATION ==
// == BY João Cunha - [email protected]
// == @ 31/03/2012
// == USE AND MODIFY AT WILL
// == TESTED ON PRESTASHOP V1.4.7X
if (!$result) { //<- INVALID PRESTASHOP LOGIN, IT MAY BE A ZEN-CART / OSCOMMERCE     PASSWORD
//CHECK IF THE GIVEN EMAIL MATCHES A ROW IN OUR LEGACY TABLE AND RETRIEVES THE LEGACY     PASSWORD
$resultZC = Db::getInstance()->getRow('
SELECT `password`
FROM `zc_legacy_passwords`
WHERE `email` = \''.pSQL($email).'\'
AND `updated` = 0');

 if (!$resultZC)
return false; //<- EMAIL NOT FOUND IN NONE OF THE TABLES, SO IT IS AN INVALID LOGIN

//ENCRYPTS THE GIVEN PASSWORD IN ZEN-CART / OSCOMMERCE FORMAT
$salt = substr($resultZC['password'], strrpos($resultZC['password'],':')+1, 2);
$ZCpassword = md5($salt . $passwd) . ':' . $salt;

if ($ZCpassword != $resultZC['password'])
return false; //<- WRONG ZEN-CART/OSCOMMERCE PASSWORD GIVEN

//WE'LL UPDATE THE CUSTOMER TABLE WITH ITS PRESTASHOP ENCRYPTED PASSWORD...
Db::getInstance()->Execute('
                        UPDATE `'._DB_PREFIX_   .'customer`
                        SET `passwd` = \''.md5(pSQL(_COOKIE_KEY_.$passwd)).'\'
                        WHERE `email` = \''.pSQL($email).'\'');

//...AND FLAG IT AS UPDATED, SO THE NEXT TIME HE LOGS IN, HE WON'T ENTER THIS ROUTINE.
Db::getInstance()->Execute('
                UPDATE `zc_legacy_passwords`
                SET `updated` = 1
                WHERE `email` = \''.pSQL($email).'\'');

//USER IS AUTHENTICATED, OVERWRITE THE EMPTY $result VARIABLE
$result = Db::getInstance()->getRow('
SELECT *
FROM `'._DB_PREFIX_ .'customer`
WHERE `active` = 1
AND `email` = \''.pSQL($email).'\'
AND `deleted` = 0
AND `is_guest` = 0');
}
// == END ZEN-CART / OSCOMMERCE TO PRESTASHOP PASSWORD INTEGRATION

Этот код также обновит старый соленый пароль до нового типа пароля Prestashop.


person user1762733    schedule 21.10.2012    source источник
comment
Разве вам не нужны сначала оригинальные пароли? Нельзя просто изменить хэш md5. Обновите свой новый код, чтобы использовать ту же проверку пароля и генерацию кода, что и в старом коде, потому что иначе вы не сможете этого сделать.   -  person Cyclone    schedule 21.10.2012
comment
Да, у меня есть оригинальные зашифрованные пароли. Приведенный выше код обновляет новый код, но в формате Zen Cart / OScommerce. Мне нужна помощь в изменении приведенного выше кода, чтобы вместо этого обновить новый код - код CubeCart (CC).   -  person user1762733    schedule 22.10.2012
comment
Вам нужны оригинальные НЕШифрованные пароли.   -  person Cyclone    schedule 23.10.2012
comment
Я не понимаю, зачем вам нужны незашифрованные пароли - не могли бы вы просто хэшировать зашифрованные и использовать эти теперь дважды хешированные пароли для сохранения / аутентификации?   -  person iono    schedule 13.08.2013


Ответы (2)


это не важно, потому что это просто проверка пароля:

ВЫБЕРИТЕ password ИЗ zc_legacy_passwords ГДЕ email = \ ''. PSQL ($ email). '\' AND updated = 0 ');

а затем этот код проверяет пароль в таблице базы данных ZenCart / OScommerce, которую вы можете удалить или прокомментировать (просто игнорируйте)

$ salt = substr ($ resultZC ['пароль'], strrpos ($ resultZC ['пароль'], ':') + 1, 2); $ ZCpassword = md5 ($ salt. $ Passwd). ':'. $ соль;

if ($ ZCpassword! = $ resultZC ['пароль']) return false;

и это важно, потому что будет хранить и изменять пароль для prestashop (здесь не нужно изменять)

Db :: getInstance () -> Execute ('UPDATE '._DB_PREFIX_ .'customer SET passwd = \' '. Md5 (pSQL (_COOKIE_KEY _. $ Passwd)).' \ 'WHERE email = \' '. PSQL ($ email).' \ ' ');

игнорируйте это:

Db :: getInstance () -> Execute ('UPDATE zc_legacy_passwords SET updated = 1 WHERE email = \' '. PSQL ($ email).' \ '');

игнорируйте это:

$ result = Db :: getInstance () -> getRow ('SELECT * FROM '._DB_PREFIX_ .'customer WHERE active = 1 AND email = \' '. pSQL ($ email).' \ 'AND deleted = 0 AND is_guest = 0');

Итак, код будет выглядеть так:

if (! $ result) {

Db :: getInstance () -> Execute ('ОБНОВЛЕНИЕ '._DB_PREFIX_ .'customer НАБОР

passwd = \ ''. Md5 (pSQL (_COOKIE_KEY _. $ Passwd)). '\' ГДЕ email =

\ ''. pSQL ($ email). '\' ');

}

person hendrathings    schedule 25.10.2012
comment
Спасибо, hendrathings. Это работает для обновления пароля, но не проверяет пароль с помощью старого метода шифрования. Я бы хотел сначала проверить пароль в старом методе шифрования (соль + пароль), а затем, если он совпадает, обновить пароль. - person user1762733; 06.11.2012
comment
хем, какая версия твоя тележка? Я не уверен, что проверю, если я не знаю, что использовать для шифрования md5 / sha1 - person hendrathings; 07.11.2012
comment
попробуйте следующее: if (hash('whirlpool', $salt.$value.$salt)) return false; измените $value на БЕЗПРИПИСАННЫЕ пароли клиентов и $salt на настройки соли. если не задана соль, попробуйте substr(str_pad(dechex(mt_rand()), 8, '0', STR_PAD_LEFT ), -8); создать соль, это значение по умолчанию в cubecart версии 5. - person hendrathings; 07.11.2012

Перенести пароль с другим шифрованием так сложно, даже невозможно. Итак, может быть, уже слишком поздно для вашего вопроса, я думаю, что любой, кто хочет перенести пароли, должен попробовать доступный для их автоматического перемещения. Этот инструмент не требует от вас каких-либо технических навыков без простых щелчков мышью. LitExtension - одно из моих предложений. Конечно, нужно немного заплатить, но это не слишком много.

person Hana    schedule 13.09.2016