La fonction Mcrypt est obsolète à partir de PHP 7.1.0.
Mes fonctions de codage/décodage de chaîne obsolètes:
$key: secret key
$str: string
$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $str, MCRYPT_MODE_CBC, md5(md5($key))));
$decoded = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($str), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
Pouvez-vous suggérer des alternatives?
Vous devriez utiliser openssl_encrypt à la place. Cordialement!
Comme mentionné ci-dessus, open_ssl est une bonne alternative à mcrypt. Le seul problème que j'ai avec open_ssl, c'est qu'il ne peut pas être utilisé avec des chaînes de grande taille.
J'ai écrit un script (classe statique), qui résout ce problème (les grandes chaînes sont divisées en morceaux et cryptées/décryptées séparément en arrière-plan).
Voir Gist public: https://Gist.github.com/petermuller71/33616d55174d9725fc00a663d30194ba
Après quelques itérations et danses avec documentation , j'ai créé la solution pour remplacer la fonction Mcrypt dépréciée par les fonctions de codage/décodage suivantes, basées sur les fonctions openssl_encrypt et openssl_decrypt:
//Return encrypted string
public function stringEncrypt ($plainText, $cryptKey = '7R7zX2Urc7qvjhkr') {
$length = 8;
$cstrong = true;
$cipher = 'aes-128-cbc';
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt(
$plainText, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $cryptKey, $as_binary=true);
$encodedText = base64_encode( $iv.$hmac.$ciphertext_raw );
}
return $encodedText;
}
//Return decrypted string
public function stringDecrypt ($encodedText, $cryptKey = '7R7zX2Urc7qvjhkr') {
$c = base64_decode($encodedText);
$cipher = 'aes-128-cbc';
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ivlenSha2len = $ivlen+$sha2len;
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$plainText = openssl_decrypt(
$ciphertext_raw, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
}
return $plainText;
}
Pour MCRYPT_RIJNDAEL_256
j'ai posté une réponse complète pour PHP7.3 ici: https://stackoverflow.com/a/53937314/243782
fragment:
fonctionne comme ceci avec la bibliothèque phpseclib
$rijndael = new \phpseclib\Crypt\Rijndael(\phpseclib\Crypt\Rijndael::MODE_ECB);
$rijndael->setKey(ENCRYPT_KEY);
$rijndael->setKeyLength(256);
$rijndael->disablePadding();
$rijndael->setBlockLength(256);
$decoded = $rijndael->decrypt($term);