#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.