从 Prestashop 1.6 MD5 加密更新到 1.7

Updating from Prestashop 1.6 MD5 encryption to 1.7

我正在将 PS 1.6 更新到 1.7。我知道 PS 1.6 使用这种加密方法 md5(_COOKIE_KEY_.$passwd) 但我们之前将其转换为 md5($passwd) 以与我们以前的商店 not-prestashop 兼容。

现在我们要更新到1.7,我们看到加密方式已经变成了hash()。我们已经实现了登录以前的用户更改此功能:getByEmail(),但现在我们希望注册能够正常工作(将密码保存为md5($plaintextpassword))。我们知道新的加密方法更安全,不建议使用 md5($plaintextpassword) 但现在我们无法更改它。

我们更改了 Classes/Customer.php 中的所有行:

$this->passwd = $crypto->hash($password);

至:

$this->passwd = md5($password);

但是随着我们注册新用户时发生的所有这些变化,它被保存为这种格式的 hash() 方法 $2y$10$VPm9ygay2ldd0Vu0J4ttQuOdD/mIytURV/nXCXKs4GcB4AkIWtaQm 而不是:bcef5cffa6f4bb0abb94cf6fa7a7cb2f。我没有找到必须更改以所需格式保存的位置?

您必须覆盖 PrestaShop 并添加新的附加密码检查程序:

if(!loginWithOriginalMethod($password)) {
    loginWithAdditionalMethod($password);
}

通过这种方式,您的新老客户都可以登录您的店铺

如果您可以直接在数据库中导入以前的 1.6 散列,并且保留相同的 cookie 密钥,则该函数是向后兼容的。

但是如果像我一样 1.6 散列在我使用 csv 功能导入时使用新的 cookie 密钥重新散列,您需要更新 src/Core/Crypto/Hashing.php,替换最后一个函数通过:

确保用 Prestashop 1.6 中的 cookie 密钥替换

private function initHashMethods()
    {
        $this->hashMethods = array(
            'bcrypt' => array(
                'option' => array(),
                'hash' => function ($passwd, $staticSalt, $option) {
                    return password_hash($passwd, PASSWORD_BCRYPT);
                },
                'verify' => function ($passwd, $hash, $staticSalt) {
                    /*
                     * Prevent enumeration because nothing happens
                     * when there is no, or an invalid hash.
                     * Also, change the password to be sure it's not maching
                     * the new hash.
                     * The new hash is equal to 'test' in BCRYPT context.
                     */
                    if (empty($hash)) {
                        $hash = 'y$azRqq.pN0OlWjeVfVMZXOOwqYAx1hMfme6ZnDV.27grGOEZvG.uAO';
                        $passwd = 'wrongPassword';
                    }

                    return password_verify($passwd, $hash);
                },
            ),
            'md5' => array(
                'option' => array(),
                'hash' => function ($passwd, $staticSalt, $option) {
                    return md5($staticSalt . $passwd);
                },
                'verify' => function ($passwd, $hash, $staticSalt) {
                    return md5($staticSalt . $passwd) === $hash;
                },
            ),
            'bcryptmd5' => array(
                'option' => array(),
                'hash' => function ($passwd, $staticSalt, $option) {
                    return password_hash(md5('<your 1.6 cookie key>' . $passwd), PASSWORD_BCRYPT);
                },
                'verify' => function ($passwd, $hash, $staticSalt) {
                    /*
                     * Prevent enumeration because nothing happens
                     * when there is no, or an invalid hash.
                     * Also, change the password to be sure it's not maching
                     * the new hash.
                     * The new hash is equal to 'test' in BCRYPT context.
                     */
                    if (empty($hash)) {
                        $hash = 'y$azRqq.pN0OlWjeVfVMZXOOwqYAx1hMfme6ZnDV.27grGOEZvG.uAO';
                        $passwd = 'wrongPassword';
                    }

                    return password_verify(md5('<your 1.6 cookie key>' . $passwd), $hash);
                },
            ),
        );
    }