現在廃止されている「mcrypt」を使用する特定の WordPress プラグインを改善したいと考えています。代わりに、OpenSSL ライブラリを使用して送信されたデータを暗号化したいのですが、暗号化プロセス中に問題が発生します。つまり、openssl_encrypt 関数が mcrypt_encrypt とは異なる値を返し、接続しているシステムが正しいデータを返しません。値があり、その所有者は私がアップロードしたコンテンツのログを私に送信できません:(
インターネット全体を検索しましたが、まだ解決策が見つかりません。パディングに問題があると思われますが、解決策が見つかりません。手伝ってくれますか?
以下は、PHP オブジェクト $password、$salt、$iv
内の明らかな変更です。 リーリー言い忘れました: OPENSSL_ZERO_PADDING はエラーを返します。 OPENSSL_RAW_DATA を使用すると、mcrypt_encrypt と同様の結果が得られますが、末尾が異なります。例:
OpenSSL: rPzVvF7gaPMA4ADAjHUW8Wy1ThTJG+VPdcz5iKAkAwrDTTFTcOpWgWOCh9l9JFZ8WcNzMJ868026TkUxcYJMrQ==
MCRYPT:rPzVvF7gaPMA4ADAjHUW8Wy1ThTJG+VPdcz5iKAkAwrDTTFTcOpWgWOCh9l9JFZ8UGVfF091Q9bY61mTRg+BSg==
P粉0218547772023-09-10 15:21:03
encryptSSL()
では、Base64 エンコードは現在、デフォルトで明示的に 1 回、暗黙的に 1 回の計 2 回使用されています。したがって、明示的か暗黙的かにかかわらず、Base64 エンコーディングの 1 つを削除する必要があります。前者は base64_encode()
呼び出しを削除することで実現され、後者は OPENSSL_RAW_DATA
フラグを設定することで実現されます。
さらに、mcrypt はゼロ パディングを使用し、PHP/OpenSSL は PKCS#7 パディングを使用します。したがって、encryptSSL()
が encryptMCRYPT()
と同じ結果を得るには、ゼロ パディングを使用する必要があります。 PHP/OpenSSL はゼロ パディングをサポートしていないため、PKCS#7 パディングを無効にし (OPENSSL_ZERO_PADDING フラグを使用)、ゼロ パディングを明示的に実装する必要があります>.
これらの変更により、両方の関数で同じ結果が得られます。
ゼロ パディングは PKCS#7 パディングよりも信頼性が低いことに注意してください。
###安全性:###
静的 IV と静的ソルトはバグであることに注意してください。代わりに、両方がランダムに生成され、暗号文とともに、通常は連結されて復号化パーティに渡されます (どちらも秘密ではありません)。また、PBKDF2 の反復回数 100 は通常、少なすぎます。