摘要:廢棄加密方法替換方案前瞻最近,我負責在重構項目的支付渠道,因為之前都是接一個渠道在的方式,代碼顯的比較混亂,恰巧整體項目在微服務化,所以我們決定將支付做成一個微服務,獨立出來。
PHP7.1廢棄加密方法替換方案 前瞻
最近,我負責在重構項目的支付渠道,因為之前都是接一個渠道在ifelse的方式,代碼顯的比較混亂,恰巧整體項目在微服務化,所以我們決定將支付做成一個微服務,獨立出來。當前比較熱門的支付渠道,比如說支付寶、微信等,做支付業務比較早,文檔相對來說,或者整個的支付方案是比較成熟的。前面接的都是比較順利的。但是,我們還接入了京東金融,可能京東金融支付做的比較晚,文檔肯定比不上前面的兩家,最最最操蛋的是JD提供的工具類中的encrypted方法是使用mcrypt_encrypt那么問題來了。
首先,我們來看一下PHP官方網站的備注。
mcrypt_encrypt
(PHP 4 >= 4.0.2, PHP 5, PHP 7)
mcrypt_encrypt — 使用給定參數加密明文
注意,下面還有一個爆炸點:
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版本了,沒辦法只能尋找替代方案。
原方案之前所有的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...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25714.html
摘要:擴展已經過時了大約年,并且用起來很復雜。因此它被廢棄并且被所取代。從起它將被從核心代碼中移除并且移到中。手冊在遷移頁面給出了替代方案就是用取代加密,支持加密要加密的數據加密加密后的數據解密要解密的數據加密解密后的數據可據需求,自行改編。 mcrypt 擴展已經過時了大約10年,并且用起來很復雜。因此它被廢棄并且被 OpenSSL 所取代。 從PHP 7.2起它將被從核心代碼中移除并且移...
摘要:大家可以根據代碼不同的填充方式來選擇不同的替換方案,但其中有三個細節需要說明為什么要有填充用替換后算法的名稱為何不同接下來會則會具體分析填充算法。 PHP7.1中使用openssl替換mcrypt 在php開發中,使用mcrypt相關函數可以很方便地進行AES加、解密操作,但是PHP7.1中廢棄了mcrypt擴展,所以必需尋找另一種實現。在遷移手冊中已經指出了用openssl代替mcr...
摘要:也可以接入項目打包測試流程做代碼檢測。擴展替換以后廢棄了和擴展,項目中使用的使用的類使用的是已經廢棄的擴展使用擴展做兼容替換。測試方案和大部分公司差不多,項目組劃分了線下開發環境預發布環境和生產環境三個環境。 項目由PHP5.5切換至PHP7.1.15 背景 從2015年鳥哥的技術分享,我們知道PHP7是對底層實現得一次完全重構,函數調用機制和內存管理等很多方便做了優化,使PHP性能有...
摘要:項目背景因為自己開發的接口希望在傳遞的工程中可以保證參數是密文的形式,主要是前端使用加密,后端使用解密在網絡上搜索了很多的方法,但是大部分的都是使用和進行端的加解密,但是眾所周知的問題,這兩個方法在以后將會被廢棄,故而采用。 項目背景 因為自己開發的接口希望在傳遞的工程中可以保證參數是密文的形式,主要是前端使用js加密,后端使用php解密 在網絡上搜索了很多的方法,但是大部分的都是使...
摘要:項目背景因為自己開發的接口希望在傳遞的工程中可以保證參數是密文的形式,主要是前端使用加密,后端使用解密在網絡上搜索了很多的方法,但是大部分的都是使用和進行端的加解密,但是眾所周知的問題,這兩個方法在以后將會被廢棄,故而采用。 項目背景 因為自己開發的接口希望在傳遞的工程中可以保證參數是密文的形式,主要是前端使用js加密,后端使用php解密 在網絡上搜索了很多的方法,但是大部分的都是使...
閱讀 2852·2023-04-25 17:59
閱讀 682·2023-04-25 15:05
閱讀 673·2021-11-25 09:43
閱讀 3034·2021-10-12 10:13
閱讀 3537·2021-09-27 13:59
閱讀 3583·2021-09-23 11:21
閱讀 3879·2021-09-08 09:35
閱讀 564·2019-08-29 17:12