我为Prestashop 1.6创建了一些基于php的第三方系统。它可以直接连接Prestashop数据库。并且知道Im将我的Presta升级到了1.7.5.1并开始工作了。只有它不再登录客户,因为我看到密码加密已更改。我在1.6上使用了md5(COOKIE_KEY.'password'),但在1.7上看到的密码与md5完全不同。你能告诉我加密是怎么回事。 (如果您用PHP代码告诉我,情况会变得更好)
Prestashop 1.7.5.1
$ 2y $ 10 $ 6b460aRLklgWblz75NAMteYXLJwjfV6a / uN8GJKgJgPDBuNhHs.ym
代表123456
答案 0 :(得分:1)
PrestaShop 1.7.x现在使用bcrypt作为首选的哈希方法(尽管仍然支持md5)。
为了更好地了解PrestaShop v1.6.x与1.7.x之间用于检查密码的行为,让我们看一下Customer类中的getByEmail()
方法:
/**
* Return customer instance from its e-mail (optionally check password).
*
* @param string $email e-mail
* @param string $plaintextPassword Password is also checked if specified
* @param bool $ignoreGuest
*
* @return bool|Customer|CustomerCore Customer instance
*/
public function getByEmail($email, $plaintextPassword = null, $ignoreGuest = true)
如果提供了$plaintextPassword
,则使用以下方式检索密码的加密版本:
$this->passwd = $crypto->hash($plaintextPassword);
可以通过以下操作实例化Hashing类:
$crypto = ServiceLocator::get('\\PrestaShop\\PrestaShop\\Core\\Crypto\\Hashing');
使用PrestaShop 1.7类/方法的示例解决方案:
<?php
namespace PrestaShop\PrestaShop\Core\Crypto;
include('config/config.inc.php');
$plaintextPassword = '123456';
$crypto = new Hashing;
$encryptedPassword = $crypto->hash($plaintextPassword, _COOKIE_KEY_);
echo 'Clear: '.$plaintextPassword.'<br />Encrypted: '.$encryptedPassword;
/* Result (example)
Clear: 123456
Encrypted: $2y$10$6b460aRLklgWblz75NAMteYXLJwjfV6a/uN8GJKgJgPDBuNhHs.ym */
替代解决方案,无需包含任何PrestaShop文件/方法:
<?php
$plaintextPassword = '123456';
$encryptedPassword = password_hash($plaintextPassword, PASSWORD_BCRYPT);
echo var_dump(password_verify($plaintextPassword, $encryptedPassword)); // True if encryption is matching
我希望这会有所帮助。