> 백엔드 개발 > PHP 튜토리얼 > PHP 7.1_php 팁에서 Mcrypt 암호화 및 복호화 대신 OpenSSL을 사용하는 방법에 대한 자세한 설명

PHP 7.1_php 팁에서 Mcrypt 암호화 및 복호화 대신 OpenSSL을 사용하는 방법에 대한 자세한 설명

韦小宝
풀어 주다: 2023-03-17 18:28:01
원래의
2025명이 탐색했습니다.

최근 PHP를 사용하여 WeChat 공개 계정 기능을 개발하던 중, PHP 7.1에서 Mcrypt가 더 이상 사용되지 않는 것을 발견했습니다. 이를 대체할 수 있는 솔루션을 찾을 수밖에 없었기 때문에 이 글에서는 주로 소개합니다. PHP 7.1에서 Mcrypt 암호화 및 복호화 대신 OpenSSL 사용에 대한 관련 정보가 필요한 친구는 참고할 수 있습니다.

요약:

php7.1 출시 후 새로운 기능은 많은 PHP 사용자의 관심을 끌었으며 모든 사람들은 새로운 기능이 가져오는 이점과 편의성에 대해 논의했습니다. 그러나 php7.0에서 php7.1로 업그레이드하면 과거에 일반적으로 사용되던 확장(mcrypt 확장)이 폐기(obsolete)됩니다. 해당 관계자는 해당 해결방안을 제시하지만, 더 자세한 해결방안은 제시하지 않습니다. 여기에 함정이 있습니다.

오늘 WeChat 개방형 플랫폼을 사용하여 콘텐츠 관리 시스템에 연결했을 때 공식 계정을 바인딩할 때 계속 실패했습니다.

이유:

디버깅 중에 다음을 발견했습니다. 직접적인 이유는 오픈 플랫폼에 인증 이벤트가 채워져 있기 때문입니다(이 인증 이벤트는 티켓을 업데이트하기 위해 10분마다 이벤트를 보냅니다). 즉:

여기에 채워진 URL이 디버깅을 통해 발견된 URL은 다음과 같습니다. 맞네요. 위챗도 10분마다 푸쉬했는데 끝까지 티켓이 안왔네요. 코드를 보니 위챗에서 데이터를 복호화할 때 오류가 보고되었기 때문인 것으로 나타났습니다:


<?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; 
}
로그인 후 복사


수정된 코드:


<?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; 
 /* mcrypt对称加密代码在PHP7.1已经被抛弃了,所以使用下面的openssl来代替 
 $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); 
 */ 
 
 $encrypted = openssl_encrypt($text, &#39;AES-256-CBC&#39;, $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); 
 $encrypt_msg = base64_encode($encrypted); 
 return $encrypt_msg; 
}
로그인 후 복사


특별한 주의 사항: WeChat 개발과 관련된 모든 프로세스에서 PHP 7.1로 업그레이드한 경우 Mcrypt 대칭 암호화 및 암호 해독이 사용되는지 확인해야 합니다. WeChat 개발 문서에 사용된 데모도 사용됩니다. Mcrypt 암호화 및 복호화에 주의가 필요합니다.

요약

위 내용은 모두의 WeChat 개발에 도움이 되기를 바랍니다. 궁금한 점이 있으면 이 사이트의 커뮤니티 Q&A에 문의하세요!


관련 권장 사항:

php7.1의 mcrypt_module_open() 메서드 대체

php mcrypt 암호화 및 암호 해독 예제 코드

php with openssl 암호화 기반으로 구현 그리고 복호화 방법

위 내용은 PHP 7.1_php 팁에서 Mcrypt 암호화 및 복호화 대신 OpenSSL을 사용하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿