ホームページ  >  記事  >  バックエンド開発  >  Mcrypt暗号化・復号化の代わりにOpenSSLを使用したPHP 7.1の例の説明

Mcrypt暗号化・復号化の代わりにOpenSSLを使用したPHP 7.1の例の説明

*文
*文オリジナル
2017-12-25 10:19:541247ブラウズ

Mcrypt 一部の WeChat 開発者はよく使用するかもしれませんが、Mcrypt は PHP 7.1 で非推奨になりました。他に代替手段はありますか?この記事では、PHP 7.1 で Mcrypt 暗号化と復号化の代わりに OpenSSL を使用することに関する関連情報を紹介します。

概要:

php7.1 のリリース後、新機能は多くの PHPer を魅了し、誰もが新機能によってもたらされる利点と利便性について議論していました。ただし、php7.0からphp7.1にアップグレードすると、過去によく使われていた拡張機能(mcrypt拡張機能)が廃止(廃止)されます。公式は対応する解決策のヒントを提供しましたが、より詳細な解決策は提供しませんでした。ここに落とし穴があります:

今日、WeChat オープン プラットフォームを使用してコンテンツ管理システムに接続すると、公式アカウントをバインドするときに失敗し続けました

理由:

デバッグ中に、直接の理由は、オープン プラットフォームに認証イベントが入力されたためです (この認証イベントは、チケットを更新するために 10 分ごとにイベントを送信します)。つまり、

この場所に URL が入力され、デバッグにより、この URL がそうです、WeChat も 10 分ごとにプッシュされましたが、チケットは最後まで受信されませんでした。コードを見ると、WeChat からのデータを復号するときにエラーが報告されたためであることがわかりました:


<?php 

function aes_decode($message, $encodingaeskey = &#39;&#39;, $appid = &#39;&#39;) { 
 $key = base64_decode($encodingaeskey . &#39;=&#39;); 
 $ciphertext_dec = base64_decode($message); 
 $iv = substr($key, 0, 16); 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;); 
 mcrypt_generic_init($module, $key, $iv); 
 $decrypted = mdecrypt_generic($module, $ciphertext_dec); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 
 $pad = ord(substr($decrypted, -1)); 
 if ($pad < 1 || $pad > 32) { 
 $pad = 0; 
 }


ここです。私の環境はPHP 7.1なので、情報を検索したところ、PHP 7.1ではMcryptが放棄されているため、このコード内のmcrypt_*が実行できないことがわかりました。

解決策:

情報を探していると、Mcrypt を OpenSSL で置き換えることができることがわかりました (OpenSSL 拡張機能がインストールされていることが条件ですが、通常はデフォルトでインストールされます)

openssl は強力なツール キットです。多くの暗号アルゴリズムと実用的なツール。提供されるコマンド コンソール ツールを使用して、ファイルを暗号化および復号化するためのキーと証明書を生成することも、提供される API インターフェイスを使用して、コード内で送信される情報を暗号化することもできます。

したがって、上記のコードは次のように変更できます:


<?php 
function aes_decode($message, $encodingaeskey = &#39;&#39;, $appid = &#39;&#39;) { 
 $key = base64_decode($encodingaeskey . &#39;=&#39;); 
 $ciphertext_dec = base64_decode($message); 
 $iv = substr($key, 0, 16); 
 /* mcrypt对称解密代码在PHP7.1已经被抛弃了,所以使用下面的openssl来代替 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;); 
 mcrypt_generic_init($module, $key, $iv); 
 $decrypted = mdecrypt_generic($module, $ciphertext_dec); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 */ 
 $decrypted = openssl_decrypt($ciphertext_dec, &#39;AES-256-CBC&#39;, $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); 
 
 $pad = ord(substr($decrypted, -1)); 
 if ($pad < 1 || $pad > 32) { 
 $pad = 0; 
 }


追加:

上記の復号化が変更された場合、対応する Mcrypt 暗号化も変更する必要があります。変更されていない これにより、ネットワーク全体に公開できない、メッセージをプッシュできないなどのイベントが発生します。 暗号化されたソース コードは次のとおりです。

<?php 
function aes_encode($message, $encodingaeskey = &#39;&#39;, $appid = &#39;&#39;) { 
 $key = base64_decode($encodingaeskey . &#39;=&#39;); 
 $text = random(16) . pack("N", strlen($message)) . $message . $appid; 
 $iv = substr($key, 0, 16); 
 $block_size = 32; 
 $text_length = strlen($text); 
 $amount_to_pad = $block_size - ($text_length % $block_size); 
 if ($amount_to_pad == 0) { 
 $amount_to_pad = $block_size; 
 } 
 $pad_chr = chr($amount_to_pad); 
 $tmp = &#39;&#39;; 
 for ($index = 0; $index < $amount_to_pad; $index++) { 
 $tmp .= $pad_chr; 
 } 
 $text = $text . $tmp; 
 $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;); 
 mcrypt_generic_init($module, $key, $iv); 
 $encrypted = mcrypt_generic($module, $text); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 
 $encrypt_msg = base64_encode($encrypted); 
 return $encrypt_msg; 
}



特別な注意:

WeChat 開発に関係するプロセスでは、PHP 7.1 にアップグレードした場合、Mcrypt 対称暗号化と復号化が使用されているかどうかを確認する必要があります。WeChat 開発ドキュメントで使用されているデモも同様です。 Mcrypt 暗号化と復号化を使用します。この点は注意が必要です。

関連する推奨事項:



PHP WeChat インターフェイスのカプセル化クラス_PHP チュートリアル

php WeChat 開発プラットフォーム開発小規模テスト


PHP WeChat 支払いクラスデモ_phpインスタンス

以上がMcrypt暗号化・復号化の代わりにOpenSSLを使用したPHP 7.1の例の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。