ホームページ >バックエンド開発 >PHPチュートリアル >PHP で Mcrypt 暗号化と復号化の代わりに OpenSSL を使用するにはどうすればよいですか?

PHP で Mcrypt 暗号化と復号化の代わりに OpenSSL を使用するにはどうすればよいですか?

php中世界最好的语言
php中世界最好的语言オリジナル
2017-12-20 14:37:191808ブラウズ

最近、WeChat パブリック アカウントの開発中に問題を発見しました。つまり、PHP7.1 が mcrypt で廃止されたため、この問題を解決する方法しか見つかりません。今日は、この問題をどのように解決したかを説明します。解決策のアイデア。

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

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

理由:

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


この場所に URL が入力され、デバッグによりこの URL が正しいことが判明しました。WeChat も同様ですが10分ごとにプッシュするのですが、最後までチケットを受け取ることができませんでした。コードを見ると、WeChatからのデータを復号するときにエラーが報告されたためであることがわかりました。私の環境は 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);
  
 $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;
 }

追加:


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

暗号化されたソース コードは次のとおりです:

<?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;
 }

変更されたコードは次のとおりです:

<?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 が使用されていることに注意する必要があります。

概要

Ajax非同期リクエストテクノロジーを例を交えて説明

AJAXの共通構文とは何ですか

AJAXの原則とCORSクロスドメインメソッド

以上がPHP で Mcrypt 暗号化と復号化の代わりに OpenSSL を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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