PHP7.1廢棄加密方法替換方案

PHP7.1廢棄加密方法替換方案

前瞻

最近,我負責在重構項目的支付渠道,由於以前都是接一個渠道在ifelse的方式,代碼顯的比較混亂,恰巧總體項目在微服務化,因此咱們決定將支付作成一個微服務,獨立出來。當前比較熱門的支付渠道,好比說支付寶、微信等,作支付業務比較早,文檔相對來講,或者整個的支付方案是比較成熟的。前面接的都是比較順利的。可是,咱們還接入了京東金融,可能京東金融支付作的比較晚,文檔確定比不上前面的兩家,最最最操蛋的是JD提供的工具類中的encrypted方法是使用mcrypt_encrypt那麼問題來了。php

首先,咱們來看一下PHP官方網站的備註。
mcrypt_encrypt算法

(PHP 4 >= 4.0.2, PHP 5, PHP 7)
mcrypt_encrypt — 使用給定參數加密明文微信

注意,下面還有一個爆炸點:php7

Warning微服務

This function has been DEPRECATED as of PHP 7.1.0. Relying on this function is highly discouraged.工具

string mcrypt_encrypt ( string $cipher , string $key , string $data , string $mode [, string $iv ] )網站

what? php7.1已經再也不支持了。官方來的太忽然,我以爲在PHP7.0這個大版本就應該直接淘汰了,可是在小版本淘汰,有點操蛋。恰好咱們項目就是使用是已經在7.1版本了,沒辦法只能尋找替代方案。this

原方案

以前全部的php版本對3des加密方式都是相似以下代碼,加密方式是沒問題的。編碼

$size = mcrypt_get_block_size ( 'des', 'ecb' );
$td = mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '' );
$iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND );
// 使用MCRYPT_3DES算法,cbc模式@mcrypt_generic_init ( $td, $key, $iv );
// 初始處理
$data = mcrypt_generic ( $td, $input );
// 加密
mcrypt_generic_deinit ( $td );
// 結束
mcrypt_module_close ( $td );
return $data;

替代方案

官方貌似是沒有給到替代方案,其實咱們其實在不少場景下都在使用一種加密方式。那就是openssl,
咱們使用的是openssl_encrypt。咱們看一下官方。加密

openssl_encrypt

(PHP 5 >= 5.3.0, PHP 7)
openssl_encrypt — 加密數據

說明:以指定的方式和 key 加密數據,返回原始或 base64 編碼後的字符串。

string openssl_encrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string &$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] )

針對上面的那段代碼,

$data = openssl_encrypt($input,'des-ede3',$key,0);

what?一行代碼搞定了? Yes,對的就是一行代碼搞定了。可是,openssl_encrypt加密會按照加密模式進行加密,以後還會進行base64加密一下,哈哈哈,因此須要進行解密

base64_decode($data);

此刻已經加密完成,能夠進行京東支付了。

解密

一樣,加密解密確定是同步的,既然官方已經不支持這種方式加密,固然解密方式在7.1也是被拋棄了。mdecrypt_generic

mdecrypt_generic

(PHP 4 >= 4.0.2, PHP 5, PHP 7)
mdecrypt_generic — 解密數據
string mdecrypt_generic ( resource $td , string $data )

解密數據。 請注意,因爲存在數據補齊的狀況, 返回字符串的長度可能和明文的長度不相等。

Warning

This function has been DEPRECATED as of PHP 7.1.0. Relying on this function is highly discouraged.

$td = mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '' ); // 使用MCRYPT_DES算法,cbc模式
$iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND );
$ks = mcrypt_enc_get_key_size ( $td );
@mcrypt_generic_init ( $td, $key, $iv ); // 初始處理
$decrypted = mdecrypt_generic ( $td, $encrypted ); // 解密
mcrypt_generic_deinit ( $td ); // 結束
mcrypt_module_close ( $td );
//$y = TDESUtil::pkcs5Unpad ( $decrypted );
return $decrypted;

openssl_decrypt

openssl_decrypt

(PHP 5 >= 5.3.0, PHP 7)
openssl_decrypt — Decrypts data

說明

string openssl_decrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string $tag = "" [, string $aad = "" ]]]] )

Takes a raw or base64 encoded string and decrypts it using a given method and key.

解密替代方案:

$decrypted = openssl_decrypt($encrypted,'des-ede3',$key,OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); // 解密

一樣是一行代碼,一樣這個也是會多加操做的,一樣也是base64。

後記(騷話)

其實,對於openssl_encrypt和mcrypt_encrypt,openssl_encrypt支持的加密方式更加多,就如同我在開篇所說的,我更但願是在大版本更替的時候淘汰掉這些,由於這樣引發的關注度會比較高,在小版本迭代中不會引發那麼多關注度。因此即便你沒由於版本遇到這個問題,我也但願你用到了就替換掉,openssl支持的比較全面,版本目前也比較多。

參考資料

php.net :http://php.net/manual/zh/ref....

wiki: https://wiki.openssl.org/inde...

相關文章
相關標籤/搜索