webentwicklung-frage-antwort-db.com.de

PHP7.1 Verschlüsselung Alternative

Die Mcrypt-Funktion wurde ab PHP 7.1.0 nicht mehr unterstützt.

Meine veralteten Zeichenkodierungs-/Dekodierungsfunktionen:

$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");

Können Sie Alternativen vorschlagen?

14
Tibi

Verwenden Sie stattdessen openssl_encrypt . Grüße!

16
Aleksa Arsić
echo encrypt_openssl($str, $key);

function encrypt_openssl($msg, $key, $iv = null) {
        $iv_size = openssl_cipher_iv_length('AES-256-CBC');
        if (!$iv) {
            $iv = openssl_random_pseudo_bytes($iv_size);
        }
        $encryptedMessage = openssl_encrypt($msg, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
        return base64_encode($iv . $encryptedMessage);
    }

mcrypt kann in PHP 7.1 alternative openssl entfernt werden

1

Erwägen Sie die Verwendung von defuse oder RNCryptor .

1
zaph

Wie oben erwähnt, ist open_ssl eine gute Alternative für mcrypt. Das einzige Problem, das ich mit open_ssl hatte, ist, dass es nicht für große Zeichenfolgen verwendet werden kann.

Ich habe ein Skript (statische Klasse) geschrieben, das dieses Problem überwindet (große Zeichenfolgen werden in Blöcke aufgeteilt und im Hintergrund separat verschlüsselt/entschlüsselt).

Siehe public Gist: https://Gist.github.com/petermuller71/33616d55174d9725fc00a663d30194ba

0
Peter Muller

Nach einigen Iterationen und dem Tanzen mit der Dokumentation habe ich die Lösung geschaffen, um die abgelehnte Mcrypt-Funktion durch die folgenden encode/decode-Funktionen auf der Grundlage der Funktionen openssl_encrypt und openssl_decrypt zu ersetzen:

//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

Für MCRYPT_RIJNDAEL_256 habe ich eine vollständige Antwort für PHP7.3 hier veröffentlicht: https://stackoverflow.com/a/53937314/243782

schnipsel:

funktioniert so mit der Bibliothek 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