亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

詳解PHP版本兼容之openssl調用參數

2024-05-05 00:04:41
字體:
來源:轉載
供稿:網友

背景與問題解決方式

老項目重構支付寶部分代碼整合支付寶新的sdk時發現驗簽總是失敗,才發現是open_verify最后的參數傳輸問題。而open_sign同樣如此。本文主要說明open_verify的解決方式和代碼解析。而問題的解決方式也是修改最后的加密類型參數,解決方式代碼如下:

// 將最后的常量OPENSSL_ALGO_SHA256修改成字符串openssl_verify($data, base64_decode($sign), $res, "sha256WithRSAEncryption");

官方文檔解釋

上面只說了問題的出現與對應的解決方式,如果有興趣繼續了解該函數的,可以繼續往下讀,首先來看下官方文檔對此函數的解釋。

int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )

參數注釋

data

以前用來生成簽名的數據字符串。

signature

原始二進制字符串,通過openssl_sign()或類似的函數生成。

pub_key_id

resource - 一個密鑰, 通過 openssl_get_publickey() 函數返回。

string - 一個 PEM 格式的密鑰, 比如, “—–BEGIN PUBLIC KEY—– MIIBCgK…”

signature_alg

int - 以下簽名算法之一Signature Algorithms.

string - 由openssl_get_md_methods()函數返回的可用字符串,比如, “sha1WithRSAEncryption” 或者 “sha512”.
官方文檔給出的signature_alg參數可以為int或者string類型,int類型直接調用對應的枚舉值,string則是openssl_get_md_methods函數返回的可用字符串,調用openssl_get_md_methods方法打印參數如下,而這些字符串也是對應加密方式的摘要信息,后文源碼中可能會看的對函數調用稍微明白那么一丟丟。

Array
(
[0] => DSA
[1] => DSA-SHA
[2] => DSA-SHA1
[3] => DSA-SHA1-old
[4] => DSS1
[5] => GOST 28147-89 MAC
[6] => GOST R 34.11-94
[7] => MD4
[8] => MD5
[9] => MDC2
[10] => RIPEMD160
[11] => RSA-MD4
[12] => RSA-MD5
[13] => RSA-MDC2
[14] => RSA-RIPEMD160
[15] => RSA-SHA
[16] => RSA-SHA1
[17] => RSA-SHA1-2
[18] => RSA-SHA224
[19] => RSA-SHA256
[20] => RSA-SHA384
[21] => RSA-SHA512
[22] => SHA
[23] => SHA1
[24] => SHA224
[25] => SHA256
[26] => SHA384
[27] => SHA512
[28] => dsaEncryption
[29] => dsaWithSHA
[30] => dsaWithSHA1
[31] => dss1
[32] => ecdsa-with-SHA1
[33] => gost-mac
[34] => md4
[35] => md4WithRSAEncryption
[36] => md5
[37] => md5WithRSAEncryption
[38] => md_gost94
[39] => mdc2
[40] => mdc2WithRSA
[41] => ripemd
[42] => ripemd160
[43] => ripemd160WithRSA
[44] => rmd160
[45] => sha
[46] => sha1
[47] => sha1WithRSAEncryption
[48] => sha224
[49] => sha224WithRSAEncryption
[50] => sha256
[51] => sha256WithRSAEncryption
[52] => sha384
[53] => sha384WithRSAEncryption
[54] => sha512
[55] => sha512WithRSAEncryption
[56] => shaWithRSAEncryption
[57] => ssl2-md5
[58] => ssl3-md5
[59] => ssl3-sha1
[60] => whirlpool
)

由此也可看出函數是兼容兩種模式的,但是為什么php版本會有兼容問題么?在openssl庫版本是一致的情況下,接下來的原因應該只遺留在php擴展的問題上。那下面來看看對應的源碼去發現問題出現在哪吧。

函數源碼

openssl_verify函數源碼

openssl_verify源碼中有這樣一段,如果參數method為string類型的時候,調用openssl庫的EVP_get_digestbyname方法,在網上查看了下此方法的作用,主要是根據摘要信息返回
EVP_MD結構,而EVP_get_digestbyname方法由于是openssl庫源代碼并且對C語言知之甚少,熊某就沒去查看,
只是了解php代碼調用背后的一些處理邏輯,有興趣的可以看看openssl庫的代碼實現。

if (method == NULL || Z_TYPE_P(method) == IS_LONG) {    if (method != NULL) {      signature_algo = Z_LVAL_P(method);    }    mdtype = php_openssl_get_evp_md_from_algo(signature_algo);  } else if (Z_TYPE_P(method) == IS_STRING) {    mdtype = EVP_get_digestbyname(Z_STRVAL_P(method));  } else {    php_error_docref(NULL, E_WARNING, "Unknown signature algorithm.");    RETURN_FALSE;  }

原來是枚舉值的問題?

一開始本人以為php5.3版本會是method參數類型的限制,一看源代碼才發現,openssl_verify函數的實現邏輯是一致的,都是檢測method參數類型,那么問題就不出現在參數類型上,然后我查看了參數為long類型是所調用的php_openssl_get_evp_md_from_algo函數,果然發現了問題所在。源碼如下:

php5.3.27

static EVP_MD * php_openssl_get_evp_md_from_algo(long algo) { /* {{{ */  EVP_MD *mdtype;  switch (algo) {    case OPENSSL_ALGO_SHA1:      mdtype = (EVP_MD *) EVP_sha1();      break;    case OPENSSL_ALGO_MD5:      mdtype = (EVP_MD *) EVP_md5();      break;    case OPENSSL_ALGO_MD4:      mdtype = (EVP_MD *) EVP_md4();      break;#ifdef HAVE_OPENSSL_MD2_H    case OPENSSL_ALGO_MD2:      mdtype = (EVP_MD *) EVP_md2();      break;#endif    case OPENSSL_ALGO_DSS1:      mdtype = (EVP_MD *) EVP_dss1();      break;    default:      return NULL;      break;  }  return mdtype;}

php7.1.18

static EVP_MD * php_openssl_get_evp_md_from_algo(zend_long algo) { /* {{{ */  EVP_MD *mdtype;  switch (algo) {    case OPENSSL_ALGO_SHA1:      mdtype = (EVP_MD *) EVP_sha1();      break;    case OPENSSL_ALGO_MD5:      mdtype = (EVP_MD *) EVP_md5();      break;    case OPENSSL_ALGO_MD4:      mdtype = (EVP_MD *) EVP_md4();      break;#ifdef HAVE_OPENSSL_MD2_H    case OPENSSL_ALGO_MD2:      mdtype = (EVP_MD *) EVP_md2();      break;#endif#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)    case OPENSSL_ALGO_DSS1:      mdtype = (EVP_MD *) EVP_dss1();      break;#endif    case OPENSSL_ALGO_SHA224:      mdtype = (EVP_MD *) EVP_sha224();      break;    case OPENSSL_ALGO_SHA256:      mdtype = (EVP_MD *) EVP_sha256();      break;    case OPENSSL_ALGO_SHA384:      mdtype = (EVP_MD *) EVP_sha384();      break;    case OPENSSL_ALGO_SHA512:      mdtype = (EVP_MD *) EVP_sha512();      break;    case OPENSSL_ALGO_RMD160:      mdtype = (EVP_MD *) EVP_ripemd160();      break;    default:      return NULL;      break;  }  return mdtype;}

由上面源代碼可以很清晰的發現問題所在,隨著php版本的升級,其所在的openssl擴展對應的調用條件也增加了很多,最后導致上述問題的源碼也只是switch…case少了幾個條件,在此也希望大家發現問題的時候,可以先去解決問題,然后有興趣的話可以去查看源代碼分析下問題所導致的原因。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人激情免费在线| 色偷偷9999www| 国产性色av一区二区| 亚洲一区亚洲二区| 欧美日韩中文字幕在线| 欧美日韩国产精品一区二区不卡中文| 欧美日韩第一视频| 亚洲天堂免费观看| 色综合老司机第九色激情| 91av在线精品| 久久久精品欧美| 国产成人精品免高潮在线观看| 91免费观看网站| 国产丝袜视频一区| 亚洲欧洲在线免费| 国产亚洲人成网站在线观看| 亚洲成人久久电影| 国产999精品久久久影片官网| 2021国产精品视频| 欧美精品xxx| 亚洲影视九九影院在线观看| 77777少妇光屁股久久一区| 91免费欧美精品| 高清一区二区三区四区五区| 精品久久久91| 日韩免费观看视频| 精品久久久久久久久久久久| 日产日韩在线亚洲欧美| 一区二区三区 在线观看视| 欧美在线精品免播放器视频| 精品福利在线观看| 日本精品久久电影| 色yeye香蕉凹凸一区二区av| 久久欧美在线电影| 俺去亚洲欧洲欧美日韩| 国语自产精品视频在线看抢先版图片| 亚洲欧美日韩一区二区在线| 欧美大片va欧美在线播放| 亚洲qvod图片区电影| 成人av电影天堂| 中文字幕日韩av综合精品| 96精品视频在线| 日韩一区二区在线视频| 国产成人精品久久亚洲高清不卡| 视频在线观看99| 精品精品国产国产自在线| 国产精国产精品| 最近2019中文字幕大全第二页| 日韩av在线免费| 久久久久久久av| 国产精品专区h在线观看| 国产精品福利无圣光在线一区| 欧美成年人在线观看| 琪琪亚洲精品午夜在线| 亚洲视频在线观看免费| 欧美午夜宅男影院在线观看| 97精品一区二区视频在线观看| 亚洲色图35p| 国产精品一区二区在线| 日本91av在线播放| 91亚洲人电影| 91久久在线播放| 韩国三级电影久久久久久| 国产精品久久激情| 国产精品高潮呻吟久久av无限| 92国产精品久久久久首页| 国产精品丝袜视频| 自拍偷拍亚洲在线| 欧美壮男野外gaytube| 欧美性xxxxxxx| 岛国av一区二区在线在线观看| 国产高清在线不卡| 国产区亚洲区欧美区| 久久av红桃一区二区小说| 久久久久久久久久国产精品| 国产一区二区三区三区在线观看| 国色天香2019中文字幕在线观看| 国产精品吹潮在线观看| 久久久av一区| 中文一区二区视频| 欧美自拍视频在线| 另类天堂视频在线观看| 精品国产美女在线| 国产噜噜噜噜久久久久久久久| 日韩精品免费综合视频在线播放| 国产欧美日韩丝袜精品一区| 欧美激情视频网| 91亚洲精品久久久久久久久久久久| 成人黄色av免费在线观看| 国产精品久久久久久久7电影| 韩曰欧美视频免费观看| 亚洲激情小视频| 69**夜色精品国产69乱| 91大神在线播放精品| 8x海外华人永久免费日韩内陆视频| 在线视频精品一| 久精品免费视频| 韩国三级日本三级少妇99| 日韩av黄色在线观看| 性欧美视频videos6一9| 欧美日韩亚洲一区二区三区| 美女av一区二区| 国产精品视频资源| 亚洲精品国产精品乱码不99按摩| 久久久亚洲福利精品午夜| 欧美日韩免费区域视频在线观看| 91久久精品日日躁夜夜躁国产| 亚洲国产小视频在线观看| 精品丝袜一区二区三区| 国产精品一区专区欧美日韩| 91免费看片在线| 日韩成人在线免费观看| 亚洲午夜久久久久久久| 国自产精品手机在线观看视频| 亚洲18私人小影院| 久久久精品网站| 2018国产精品视频| 大胆人体色综合| 国产亚洲a∨片在线观看| 国产999精品久久久影片官网| 日韩黄色高清视频| 九九久久久久99精品| 国产视频精品久久久| 国产精品久久久久不卡| 一本久久综合亚洲鲁鲁| 成人免费午夜电影| 国产一区二区在线免费视频| 91青草视频久久| 中文字幕亚洲国产| 欧美人成在线视频| 国产午夜精品一区理论片飘花| 久久人人爽人人爽人人片av高请| 午夜精品久久久久久久久久久久| 欧美一区二区.| 欧美xxxx14xxxxx性爽| 成人福利网站在线观看| 亚洲第一福利网站| 精品伊人久久97| 久久久噜噜噜久久久| 这里只有精品在线观看| 日韩中文有码在线视频| 国产精品美女久久| 日韩欧美成人精品| 国产精品扒开腿爽爽爽视频| 全亚洲最色的网站在线观看| 欧美极品少妇xxxxⅹ喷水| 亚洲国产精品久久久| 亚洲精品久久久久久久久久久久久| 欧美日韩亚洲一区二区三区| 亚洲国产精品一区二区三区| 久久综合免费视频影院| 91欧美日韩一区| 精品久久久久久电影| 性欧美xxxx交| 日韩最新免费不卡| 亚洲a一级视频| 久久精品国产69国产精品亚洲| 韩国美女主播一区| 久久高清视频免费| 91视频国产高清| 538国产精品视频一区二区| 久久精品国产亚洲7777| 91探花福利精品国产自产在线| 欧美另类在线播放|