Замените Mcrypt Encription на OpenSSL Encription для OpenCart CMS - PullRequest
0 голосов
/ 03 июля 2018

У меня есть OpenCart 1.5.6.4 с encryption.php файлом в system library folder.
Коды в encryption.php:

<?php
final class Encryption {
    private $key;
    private $iv;

    public function __construct($key) {
        $this->key = hash('sha256', $key, true);
        $this->iv = mcrypt_create_iv(32, MCRYPT_RAND);
    }

    public function encrypt($value) {
        return strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->key, $value, MCRYPT_MODE_ECB, $this->iv)), '+/=', '-_,');
    }

    public function decrypt($value) {
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->key, base64_decode(strtr($value, '-_,', '+/=')), MCRYPT_MODE_ECB, $this->iv));
    }
}
?>

Для перехода с php 5.6 на php 7.2 мне нужно заменить Mcrypt Encription на OpenSSL Encription.
Я заменил mcrypt_create_iv(32, MCRYPT_RAND) на openssl_random_pseudo_bytes(32, true), но для encrypt function и decrypt function я не знаю, что parameters использовать для этих функций.
Какие изменения необходимы в encription.php кодах?

1 Ответ

0 голосов
/ 07 июля 2018

Я изначально написал это , чтобы устранить пустое iv-предупреждение, которое появляется с текущим классом шифрования для OC3 * ​​1004 *:

Предупреждение: openssl_encrypt (): использование пустого вектора инициализации (iv) потенциально небезопасно и не рекомендуется

И недавно перенес его на работу с OC1.5 именно по той причине, по которой вы задали этот вопрос. Вот полная замена для system/library/encryption.php, которая будет работать на OC1.5.6.4 и PHP7.2:

final class Encryption {

    private $cipher = 'aes-256-ctr';
    private $digest = 'sha256';
    private $key;

    public function __construct($key) {
        $this->key = $key;
    }

    public function encrypt($value) {
        $key       = openssl_digest($this->key, $this->digest, true);
        $iv_length = openssl_cipher_iv_length($this->cipher);
        $iv        = openssl_random_pseudo_bytes($iv_length);
        return base64_encode($iv . openssl_encrypt($value, $this->cipher, $key, OPENSSL_RAW_DATA, $iv));
    }

    public function decrypt($value) {
        $result    = NULL;
        $key       = openssl_digest($this->key, $this->digest, true);
        $iv_length = openssl_cipher_iv_length($this->cipher);
        $value     = base64_decode($value);
        $iv        = substr($value, 0, $iv_length);
        $value     = substr($value, $iv_length);
        if (strlen($iv) == $iv_length) {
            $result = openssl_decrypt($value, $this->cipher, $key, OPENSSL_RAW_DATA, $iv);
        }
        return $result;
    }
}
...