1. 程式人生 > >【PHP7.1】使用OpenSSL來代替Mcrypt加解密【原創】

【PHP7.1】使用OpenSSL來代替Mcrypt加解密【原創】

概要:

今天在使用微信開放平臺對接一個內容管理系統的時候,在繫結公眾號的時候一直失敗

原因:

除錯的時候發現,直接原因是因為開放平臺裡面填寫的授權事件(該授權事件每十分鐘會通送一次事件來更新ticket),即:


這個地方填寫的url,除錯發現,這個URL沒錯,微信也有每10分鐘推送過來,但是到最後一直接收不到ticket,看程式碼發現是因為解密微信過來的資料的時候報錯了:

<?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;
	}
即這個地方,由於我的環境是PHP 7.1,查詢資料發現PHP 7.1已經廢棄了Mcrypt,所以這個程式碼裡面的mcrypt_*都是無法執行的。

解決:

查詢資料發現,可以通過OpenSSL來代替Mcrypt(前提是已經安裝了OpenSSL擴充套件,不過一般都是預設安裝的),所以上面的程式碼可以改為:

<?php

function aes_decode($message, $encodingaeskey = '', $appid = '') {
	$key = base64_decode($encodingaeskey . '=');

	$ciphertext_dec = base64_decode($message);
	$iv = substr($key, 0, 16);

	/* mcrypt對稱解密程式碼在PHP7.1已經被拋棄了,所以使用下面的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;
	}

補充:

上面的解密已經修改了,那麼對應的Mcrypt加密也需要修改,如果不改的話會導致不能全網釋出以及不能推送訊息等事件

加密的原始碼如下:

<?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已經被拋棄了,所以使用下面的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;
}

凡是涉及到微信開發的流程,如果已經升級到PHP 7.1的話,那麼很有必要需要檢查一下是否是使用Mcrypt對稱加解密的,微信開發文件中使用的demo也是使用Mcrypt加解密的,這一點需要注意。

相關推薦

PHP7.1使用OpenSSL代替Mcrypt解密原創

概要: 今天在使用微信開放平臺對接一個內容管理系統的時候,在繫結公眾號的時候一直失敗 原因: 除錯的時候發現,直接原因是因為開放平臺裡面填寫的授權事件(該授權事件每十分鐘會通送一次事件來更新tic

使用OpenSSL庫的AES解密

AesTest.cpp #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcn

PHP7 流程控制和函式 習題五打印出100以內的質數,一行顯示5個,(質數是隻能被1跟自身整除的數,1不是質數)

一、解法一: 1)思路: 判斷是否是質數; function is_prime($num) { for ($i = 2; $i < $num; $i++) { // 判斷是否為質數 if ($num % $i =

C++C++行內函數也可以用代替巨集

巨集是可以帶引數的,它在形式上和函式非常相似。不過不像函式,巨集僅僅是字串替換,不是按值傳遞,所以在編寫巨集時要特別注意,一不小心可能就會踩坑。 #define SQ(y) y*y 當n = 9 時,SQ(n) = 81 如果把SQ(n)換成SQ(n+1)卻得不到1

Android效能優化儘可能用RelativeLayout代替多層巢狀的LinearLayout

儘量用RelativeLayout來代替多層巢狀的LinearLayout 在Android UI開發中,有時會遇到較複雜的佈局設計,比如如下: ---------------------------------------              標題      作者             

重新編譯Nginx指導手冊修復靜態編譯Openssl的Nginx漏洞 (轉)

snippets asset 替換 業務需求 tps eight nbsp 出了 sof 1. 概述 當前爆出了Openssl漏洞,會泄露隱私信息,涉及的機器較多,環境迥異,導致修復方案都有所不同。不少服務器使用的Nginx,是靜態編譯opensssl,直接將open

UOJ#21UR#1縮進優化

splay freopen logs img hide ssi 答案 div char 我好弱啊,什麽題都做不出來QAQ 原題: 小O是一個熱愛短代碼的選手。在縮代碼方面,他是一位身經百戰的老手。世界各地的OJ上,很多題的最短解答排行榜都有他的身影。這令他感到十分愉悅。 最

UOJ#21UR #1縮進優化

一個 amp getchar() esp 統計 efi == stream etc 傳送門 http://uoj.ac/problem/21 枚舉 (調和級數?) $\sum_{i=1}^{n} (a_i / x + a_i \bmod x) =\su

開源分享:入門到精通ASP.NET MVC+EF6+Bootstrap從這裏開始,一起搭框架(1)開篇介紹

strong src 擁有 ckeditor 開發 技術分享 mdi 控制 https 框架簡介 這幾年一直在做ASP.NET開發,幾年前做項目都是老老實實一行行的寫代碼,後來發現那些高手基本都會有自己積累起來的代碼庫,現在稱之為開發框架,基礎代碼不用再去堆,

原創1.1關於阿裏圖標引用問題簡介

引入 創建 查看 壓縮 http 離線 復制 -1 選項 一、阿裏字體離線應用步驟:   1、訪問阿裏字體庫,將需要的圖標添加至自己創建指定的項目;   2、下載至本地;   3、解壓縮,新建css、font文件夾,將相應的文件夾復制粘貼到對應路徑,如圖所示:      

1Appium 1.6.3 在Xcode 8, iOS 10.2(模擬器)測試環境搭建 經驗總結

div tar post bug span trace 版本 test 4.0 Appium 1.6.3 在Xcode 8, iOS 10.2(模擬器)測試環境搭建 經驗總結 關於 Appium 1.6.3 在Xcode 8, 10.2 的iOS模擬器上的問

uoj#213. UNR #1爭奪聖杯

全部 tar while span -i long col read pro http://uoj.ac/problem/209 單調棧求出每個位置x左邊第一個大於它的位置L[x]和右第一個不小於它的位置R[x],於是矩形L[x]<=l<=x<=r<

Luogu關卡1-8BOSS戰-入門綜合練習2(2017年10月)

c代碼 更新 line logs pen 會有 我們 eof end P1426 小魚會有危險嗎 我個人覺得這個題目出的不好,沒說明白,就先只粘貼的AC代碼吧 1 #include <bits/stdc++.h> 2 using namespace st

python 練習1資產信息掃描

python 資產信息 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/10/24 0024 11:31 # @Author : ming import json import copy location = "R00L

隨筆 | 這裏是一只大一的小菜雞 NO.1

java img 程序 win log tails nco 自己的 ide 今天裝了JDK以及IDEA準備進行學習 然後在裝JDK的過程遇到了小問題 在win10 1703中 網上的教程為 path添加%JAVA_HOME%\bin; 結果出現了cmd中輸入java

VMware WorkstationPro 14中文版安裝教程趕緊收藏吧!

虛擬機安裝軟件/介紹 VMware公司發布了VMware Workstation Pro 14,而之前的版本是VMwareWorkstation Pro 12,依小編喜歡追新的慣例,果斷安裝了最新版VMware14,有的同學會好奇為什麽版本號直接從12到14呢?之所以跨過13版本,是因為13在美國是一個不吉利

Codeforces Round #197 (Div. 2) A. Helpful Maths字符串/給一個連加計算式,只包含數字 1、2、3,要求重新排序,使得連的數字從小到大

asi man title problem beginning 排序 stand should cati A. Helpful Maths time limit per test 2 seconds memory limit per t

iOS-狀態欄字體顏色白色Xcode9.1

statusbar usb options gate 狀態欄顏色 顏色 size ica 方法 Xcode9之前 設置狀態欄顏色首先在info.plist文件中,加入UIViewControllerBasedStatusBarAppearance = false;

二、.Net常用基本類庫2.1字符串處理

大寫 ons 通過 split toc 元素 *** spa 索引 使用string 定義的字符串,在定義好後,是無法修改的。如果要想改變,必須通過tocharArray()函數將原來的字符串轉化為字符(char)數組。然後再通過轉換從而形成一個新的字符串。 字符串中常用的

4.1算法遞歸 冒泡,選擇插入排序

aps 利用 nts lap spa span for 有序 位置 遞歸 程序本身自己調用自己稱之為遞歸,類似於俄羅斯套娃,體現在代碼中:用戶執行最外(N)層函數,最外側調用N-1層函數,N-1層函數調用N-2層函數... 利用函數編寫如下數列: 斐波那契數列指的是這