web-dev-qa-db-fra.com

PHP7.1 alternative mcrypt

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?

14
Tibi

Vous devriez utiliser openssl_encrypt à la place. Cordialement!

16
Aleksa Arsić

Envisagez d'utiliser defuse ou RNCryptor , ils fournissent une solution complète, sont maintenus et sont corrects.

1
zaph

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

0
Peter Muller

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;
}
0
Roman

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);
0
Pentium10