PHP7 1中使用openssl替換mcrypt

2021-09-13 15:16:13 字數 2526 閱讀 3880

在php開發中,使用mcrypt相關函式可以很方便地進行aes加、解密操作,但是php7.1中廢棄了mcrypt擴充套件,所以必需尋找另一種實現。在遷移手冊中已經指出了用openssl代替mcrypt,但未給出具體示例。網上有很多示例,可以替換大部分場景,但對於其中細節卻並未說明。同樣,簡單地使用網上示例在某種**場景下有可能導致**替換前後的相容問題,以下則來談談具體**及原因。

首先我們直接給出替換的**,再從**中分析問題。(本文中分析的演算法是aes-128-cbc)

示例會展示兩種mcrypt的使用方式,主要在於填充不同(在下文會解釋填充)。在整個加、解密過程中,完整程度高一點**則會自主實現填充、移除填充,簡單一點**會直接忽略填充,但兩種方式均可正常執行;在實際開發中(7.1之前版本),建議加上填充。請看如下具體示例:

mcrypt未使用填充

mcrypt使用填充

以上示例均可成功執行,其中第乙個示例(未使用填充,但在openssl中進行了填充)和第二個示例(使用填充,在openssl中未使用填充)在替換前後輸出相同,並無相容問題。大家可以根據**不同的填充方式來選擇不同的替換方案,但其中有三個細節需要說明

為什麼要有填充?

用openssl替換後演算法的名稱為何不同?

接下來會則會具體分析填充演算法

為什麼有填充則要從加密的演算法說起。因為在aes-128-cbc演算法中,會把要加密的字串以每16個byte的長度進行分段,逐步計算,由此導致不足16byte的段則會進行填充。所以給出的示例中會有兩種:一種是使用預設的填充,另一種是自主填充。在與openssl的替換中,如何選擇填充方案,則需要對mcrypt與openssl針對預設與自主填充有所了解。

openssl預設填充其預設方式與標準的mcrypt的自主填充方式一致,所以在第二個示例中,對於使用了如上的填充演算法後, 可直接使用openssl_encrypt替換,不會產生相容問題。填充後的加密字串如下形式:

需注意的是在openssl_encryptopenssl_decrypt中內建了填充與移除填充,所以直接使用即可,除非需自主實現填充,否則不需要考慮填充

openssl自主填充

openssl_encrypt提供了option引數以支援自主填充,但在查閱php原始碼中openssl的測試用例**才找到正確用法:

// if we want to manage our own padding

$padded_data = $data . str_repeat(' ', 16 - (strlen($data) % 16));

$encrypted = openssl_encrypt($padded_data, $method, $password, openssl_raw_data|openssl_zero_padding, $iv);

$output = openssl_decrypt($encrypted, $method, $password, openssl_raw_data|openssl_zero_padding, $iv);

var_dump(rtrim($output));

(備註:如上,openssl_zero_padding並非是為0填充的意思)

由此,我們就可以解釋,在第乙個示例中openssl_encrypt之前加入了自主點充\x00的**原因了

從以上的加、解密針對填充邏輯不同,針對上文中的示例可以很好地解釋:

分析到這,可以發現,無論是何種填充策略都需注意在加密時加入填充,在解密時則必須要移除填充。至此,上文中示例中的填充相關則分析完成了,接下來我們再看看如何選擇替換後的演算法。

在以上的示例中,有乙個問題在於,mcrypt中的aes-128-cbc演算法,在openssl中怎麼替換成了aes_256?

關於這一點, 我也未找到合理的解釋,檢視原始碼一時半會也沒找到原因(能力有限~),但通過以下資料,還是完成了功能

對於使用mcrypt aes 進行加密密的部分,若是在替換過程中問題, 可以從演算法替換或填充這兩方面著手考慮下。同時還是一必須滿足的條件是根據不同的填充方式選擇, 替換最重要的就要考慮相容問題,保證替換後不發生任何改變。 雖然只是只是有細微的差別----尾部幾個字串的不同,但若是在多平台中同時進行修改也是一件麻煩事,但變動越少風險越小。

本文只是針對aes演算法進行了簡單說明,對於其他演算法是否適用還有待研究。

php 7.1.x 中廢棄的特性:

mcrypt擴充套件廢棄:

aes演算法:

mcrypt原始碼:

openssl擴充套件原碼:

openssl 解密 mcrypt aes 資料不相容問題:

convert mcrypt_generic to openssl_encrypt ask question:

PHP7 1安裝yaf擴充套件

php71安裝yaf擴充套件 把php命令加到系統 安裝我的php安裝目錄是 usr local webserver php,所以phpize是 usr local webserver php bin phpize,但是考慮到以後可能會用到其他命令,所以一次把該目錄下的檔案都做了乙個軟鏈結 ln u...

php7 1 安裝swoole擴充套件

centos linux release 7.3.1611 core php 7.0.22 cli built aug 9 2017 18 23 24 nts mysql ver 15.1 distrib 5.5.52 mariadb,for linux x86 64 using readline ...

php7 1安裝swoole擴充套件

在已經編譯好安裝的php7.1中安裝swoole擴充套件。wget c二 解壓swoole包 tar xzvf swoole 4.2.1.tgz cd swoole 4.2.1 三 生成configure配置檔案 usr local php bin phpize四 指定php配置檔案進行預編譯 co...