您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)怎么在PHP 7.1中利用OpenSSL實(shí)現(xiàn)一個(gè)加解密功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。
原因:
調(diào)試的時(shí)候發(fā)現(xiàn),直接原因是因?yàn)殚_放平臺(tái)里面填寫的授權(quán)事件(該授權(quán)事件每十分鐘會(huì)通送一次事件來更新ticket),即:
這個(gè)地方填寫的url,調(diào)試發(fā)現(xiàn),這個(gè)URL沒錯(cuò),微信也有每10分鐘推送過來,但是到最后一直接收不到ticket,看代碼發(fā)現(xiàn)是因?yàn)榻饷芪⑿胚^來的數(shù)據(jù)的時(shí)候報(bào)錯(cuò)了:
<?php function aes_decode($message, $encodingaeskey = '', $appid = '') { $key = base64_decode($encodingaeskey . '='); $ciphertext_dec = base64_decode($message); $iv = substr($key, 0, 16); $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 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; }
即這個(gè)地方,由于我的環(huán)境是PHP 7.1,查找資料發(fā)現(xiàn)PHP 7.1已經(jīng)廢棄了Mcrypt,所以這個(gè)代碼里面的mcrypt_*都是無法運(yùn)行的。
解決:
查找資料發(fā)現(xiàn),可以通過OpenSSL來代替Mcrypt(前提是已經(jīng)安裝了OpenSSL擴(kuò)展,不過一般都是默認(rèn)安裝的)
openssl是一個(gè)功能強(qiáng)大的工具包,它集成了眾多密碼算法及實(shí)用工具。我們即可以利用它提供的命令臺(tái)工具生成密鑰、證書來加密解密文件,也可以在利用其提供的API接口在代碼中對傳輸信息進(jìn)行加密。
所以上面的代碼可以改為:
<?php function aes_decode($message, $encodingaeskey = '', $appid = '') { $key = base64_decode($encodingaeskey . '='); $ciphertext_dec = base64_decode($message); $iv = substr($key, 0, 16); /* mcrypt對稱解密代碼在PHP7.1已經(jīng)被拋棄了,所以使用下面的openssl來代替 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 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, 'AES-256-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); $pad = ord(substr($decrypted, -1)); if ($pad < 1 || $pad > 32) { $pad = 0; }
補(bǔ)充:
上面的解密已經(jīng)修改了,那么對應(yīng)的Mcrypt加密也需要修改,如果不改的話會(huì)導(dǎo)致不能全網(wǎng)發(fā)布以及不能推送消息等事件
加密的源代碼如下:
<?php function aes_encode($message, $encodingaeskey = '', $appid = '') { $key = base64_decode($encodingaeskey . '='); $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 = ''; 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, '', MCRYPT_MODE_CBC, ''); 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 = '', $appid = '') { $key = base64_decode($encodingaeskey . '='); $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 = ''; for ($index = 0; $index < $amount_to_pad; $index++) { $tmp .= $pad_chr; } $text = $text . $tmp; /* mcrypt對稱加密代碼在PHP7.1已經(jīng)被拋棄了,所以使用下面的openssl來代替 $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($module, $key, $iv); $encrypted = mcrypt_generic($module, $text); mcrypt_generic_deinit($module); mcrypt_module_close($module); */ $encrypted = openssl_encrypt($text, 'AES-256-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); $encrypt_msg = base64_encode($encrypted); return $encrypt_msg; }
特別注意:凡是涉及到微信開發(fā)的流程,如果已經(jīng)升級到PHP 7.1的話,那么很有必要需要檢查一下是否是使用Mcrypt對稱加解密的,微信開發(fā)文檔中使用的demo也是使用Mcrypt加解密的,這一點(diǎn)需要注意。
關(guān)于怎么在PHP 7.1中利用OpenSSL實(shí)現(xiàn)一個(gè)加解密功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。