ホームページ  >  記事  >  バックエンド開発  >  PHP 7.1 で Mcrypt 暗号化と復号化の代わりに OpenSSL を使用する方法の詳細な説明_php ヒント

PHP 7.1 で Mcrypt 暗号化と復号化の代わりに OpenSSL を使用する方法の詳細な説明_php ヒント

韦小宝
韦小宝オリジナル
2017-12-04 13:29:421984ブラウズ

最近PHPを使ってWeChatの公開アカウント機能を開発していたところ、PHP 7.1でMcryptが非推奨になったことを知り、代替する対応策を探すしかなかったので、この記事では主に以下を紹介します。 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 にアップグレードしている場合、WeChat 開発ドキュメントで使用されているデモでも Mcrypt 対称暗号化と復号化が使用されているかどうかを確認する必要があります。 Mcrypt の暗号化と復号化には注意が必要です。

概要


以上がこの記事のすべての内容であり、皆様の WeChat 開発に役立つことを願っております。ご質問がある場合は、このサイトのコミュニティ Q&A で質問してください。

関連する推奨事項:

php7.1のmcrypt_module_open()メソッドの代替


opensslを使用したmcrypt暗号化と復号化のサンプルコード

php暗号化の基礎としてと復号化方法

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

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