Heim > Fragen und Antworten > Hauptteil
Ich möchte ein bestimmtes WordPress-Plugin verbessern, das das mittlerweile veraltete „mcrypt“ verwendet. Stattdessen möchte ich die OpenSSL-Bibliothek verwenden, um die übermittelten Daten zu verschlüsseln, aber während des Verschlüsselungsprozesses stoße ich auf Probleme, nämlich: Die Funktion openssl_encrypt gibt einen anderen Wert zurück als mcrypt_encrypt, das System, mit dem ich verbunden bin, gibt meine Daten nicht mit dem richtigen Wert zurück Wert, und sein Besitzer kann mir kein Protokoll der Inhalte senden, die ich darauf hochgeladen habe :(
Ich habe das gesamte Internet durchsucht, aber noch keine Lösung gefunden. Ich vermute, dass das Problem an der Polsterung liegt, aber ich kann keine Lösung finden. kannst du helfen?
Hier sind die offensichtlichen Änderungen in meinen PHP-Objekten $password, $salt und $iv
class EncryptDebug{ private $algo = 'sha1'; private $password = 'ab4232goodcf423484422c90c3e4aa7c'; private $salt = 'ascastas54490a31'; private $iv = '8947da32awl55kwj' private $lenght = 16; private function generate_key(){ return hash_pbkdf2( $this->algo , $this->password , $this->salt, 100, $this->lenght, true ); } public function encryptSSL($plaintext){ $key = $this->generate_key(); $ciphertext = base64_encode(openssl_encrypt($plaintext, 'AES-128-CBC', $key, OPENSSL_ZERO_PADDING, $this->iv)); return str_replace('+', '%2B', $ciphertext); } public function encryptMCRYPT($plaintext){ $key = $this->generate_key(); $ciphertext = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_CBC, $this->iv)); return str_replace('+', '%2B', $ciphertext); } }
Ich habe vergessen zu erwähnen: OPENSSL_ZERO_PADDING gibt einen Fehler zurück. Mit OPENSSL_RAW_DATA kann ich ähnliche Ergebnisse wie mit mcrypt_encrypt erzielen, jedoch mit einer anderen Endung, zum Beispiel:
OpenSSL: rPzVvF7gaPMA4ADAjHUW8Wy1ThTJG%2BVPdcz5iKAkAwrDTTFTcOpWgWOCh9l9JFZ8WcNzMJ868026TkUxcYJMrQ==
MCRYPT: rPzVvF7gaPMA4ADAjHUW8Wy1ThTJG%2BVPdcz5iKAkAwrDTTFTcOpWgWOCh9l9JFZ8UGVfF091Q9bY61mTRg%2BBSg==
P粉0218547772023-09-10 15:21:03
在 encryptSSL()
中,当前使用 Base64 编码两次,默认情况下一次是显式编码,一次是隐式编码。因此,必须删除其中一种 Base64 编码,无论是显式编码还是隐式编码。前者是通过删除 base64_encode()
调用来实现的,后者是通过设置 OPENSSL_RAW_DATA
标志来实现的。
此外,mcrypt 使用零填充,PHP/OpenSSL 使用 PKCS#7 填充。因此,为了使 encryptSSL()
给出与 encryptMCRYPT()
相同的结果,必须使用零填充。由于 PHP/OpenSSL 不支持零填充,因此必须禁用 PKCS#7 填充(使用 OPENSSL_ZERO_PADDING 标志)并且必须显式实现零填充>.
总体:
$ciphertext = openssl_encrypt($this->zeroPad($plaintext, 16), 'AES-128-CBC', $key, OPENSSL_ZERO_PADDING, $this->iv); // remove base64_encode(), zero pad plaintext, disable PKCS#7 padding
与:
protected function zeroPad($text, $bs) { $pad = $bs - strlen($text) % $bs; return ($pad < 16) ? $text . str_repeat("\0", $pad) : $text; }
通过这些更改,两个函数给出相同的结果。
请注意,与 PKCS#7 填充相比,零填充不可靠。
安全性:
请注意,静态 IV 和静态盐是漏洞。相反,两者都将随机生成并与密文一起传递到解密方,通常是串联的(两者都不是秘密的)。
此外,PBKDF2 的迭代次数为 100 通常太小。