Эквивалентное шифрование для MCRYPT — для сохранения кода на стороне клиента

#php #encryption #mcrypt

#php #шифрование #mcrypt

Вопрос:

Я использую следующий код для выполнения шифрования с использованием mcrypt

 <?PHP

    define('SECURE_KEY','Somekey');

    function encrypt($value){
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SECURE_KEY, $value, MCRYPT_MODE_ECB, $iv);
    }

    function decrypt($value){
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SECURE_KEY, $value, MCRYPT_MODE_ECB, $iv));
    }
    $temp=encrypt("teststring");
    printf($temp);
    ?>
  

Более новые версии php обесценивают mcrypt, я ищу замену тому же, который работает с тем же ключом и выдает тот же результат, так что мне не нужно менять код на стороне клиента.

Комментарии:

1. Я рекомендую вам изменить его. Это очень старое и нестандартное, то есть MCRYPT_RIJNDAEL_256 не AES . Я предлагаю вам использовать аутентифицированные режимы шифрования, такие как AES-GCM или ChaCha20Poly1305.

2. Одна из основных причин, по которой mcrypt устарел, заключается в том, что он продвигает небезопасные методы шифрования. Если я посмотрю на ваш код, у нас есть ключ, который на самом деле является (коротким) паролем, шифрование в режиме ECB (которое на самом деле не использует IV) и заполнение нулем, которое может удалять конечные нулевые байты (хотя trim функция в противном случае сделала бы это). Это вдобавок к тому факту, что вы не используете AES, как уже указал келалака. Вам необходимо установить безопасный протокол и преобразовать в него.

3. @kelalaka okay.. подойдет.

4. @MaartenBodewes все в порядке.. подойдет.

Ответ №1:

Я автор RFC, который рекомендует отказаться от mcrypt, а затем удалить его из PHP.

Что вам обязательно следует сделать, так это перенести ваши данные, чтобы вместо этого использовать новое расширение Sodium. Узнайте, как начать работу с libsodium на PHP. Примеры кода безопасны в использовании.

 <?php
/**
 * Wrap crypto_aead_*_encrypt() in a drop-dead-simple encryption interface
 *
 * @link https://paragonie.com/b/kIqqEWlp3VUOpRD7
 * @param string $message
 * @param string $key
 * @return string
 */
function simpleEncrypt($message, $key)
{
    $nonce = random_bytes(24); // NONCE = Number to be used ONCE, for each message
    $encrypted = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(
        $message,
        $nonce,
        $nonce,
        $key
    );
    return $nonce . $encrypted;
}

/**
 * Wrap crypto_aead_*_decrypt() in a drop-dead-simple decryption interface
 *
 * @link https://paragonie.com/b/kIqqEWlp3VUOpRD7
 * @param string $message - Encrypted message
 * @param string $key     - Encryption key
 * @return string
 * @throws Exception
 */
function simpleDecrypt($message, $key)
{
    $nonce = mb_substr($message, 0, 24, '8bit');
    $ciphertext = mb_substr($message, 24, null, '8bit');
    $plaintext = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(
        $ciphertext,
        $nonce,
        $nonce,
        $key
    );
    if (!is_string($plaintext)) {
        throw new Exception('Invalid message');
    }
    return $plaintext;
}

$secretKey = random_bytes(32);
$message = 'Test message';

/* Encrypt the message: */
$ciphertext = simpleEncrypt($message, $secretKey);

/* Decrypt the message: */
try {
    $decrypted = simpleDecrypt($ciphertext, $secretKey);
    var_dump(hash_equals($decrypted, $message));
    /* bool(true) */
} catch (Exception $ex) {
    /* Someone is up to no good */
    exit(255);
}
  

Если вам нужен этап «перехода» между PHP 7.1 и более старыми версиями, а также PHP 7.2 и новее, mcrypt_compat — это библиотека полизаполнения, созданная разработчиками phpseclib для облегчения миграции между mcrypt и библиотеками, не требующими отказа от программного обеспечения (OpenSSL, Sodium).

Используйте его только для миграций. Не полагайтесь на то, что это «просто работает» и обеспечивает безопасность.

Комментарии:

1. Спасибо за ваш ответ. Я обновил версию PHP и использовал схему шифрования AES.