欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 詳解PHP版本兼容之openssl調用參數

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

熱門標簽:拉薩打電話機器人 h5 地圖標注 合肥外呼系統app 沈陽人工智能電銷機器人公司 高識別電銷機器人 智能外呼電銷系統 電銷機器人-快迭智能 寶安400電話辦理 哈爾濱400電話辦理到易號網

背景與問題解決方式

老項目重構支付寶部分代碼整合支付寶新的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少了幾個條件,在此也希望大家發現問題的時候,可以先去解決問題,然后有興趣的話可以去查看源代碼分析下問題所導致的原因。

您可能感興趣的文章:
  • 使用openssl 生成免費證書的方法步驟
  • 升級 PHP7.1 后 openssl 解密 mcrypt AES 數據不兼容問題的處理方法
  • PHP7.1中使用openssl替換mcrypt的實例詳解
  • linux環境下安裝PHP的OpenSSL擴展的方法講解
  • php7安裝openssl擴展方法
  • 詳解Linux(centos7)下安裝OpenSSL安裝圖文方法
  • Linux下Nginx安裝的方法(pcre和openssl)
  • Openssl實現雙向認證教程(附服務端客戶端代碼)

標簽:林芝 山東 威海 巴中 泰州 張家口 成都 梅州

巨人網絡通訊聲明:本文標題《詳解PHP版本兼容之openssl調用參數》,本文關鍵詞  詳解,PHP,版本,兼容,之,openssl,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解PHP版本兼容之openssl調用參數》相關的同類信息!
  • 本頁收集關于詳解PHP版本兼容之openssl調用參數的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产成人精品无码免费看夜聊软件| 人妻无码一区二区三区免费| 色综合久久久久久久久久久| 国产亚洲一区字幕| 青青草91视频| 超碰97在线资源站| 7799精品视频| 亚洲成a天堂v人片| 精品国产一二区| 欧美怡红院视频| 一区二区三区四区乱视频| 97精品国产露脸对白| 欧美又粗又大又长| 国产精品久久久久四虎| 国产白丝网站精品污在线入口| 国产99在线 | 亚洲| 久久久精品国产99久久精品芒果| 日本不卡123| 欧美做受xxxxxⅹ性视频| 91精品麻豆日日躁夜夜躁| 午夜久久久久久| 亚洲综合自拍网| 精品免费国产一区二区三区四区| 免费在线观看日韩欧美| 一区二区三区伦理片| 久久精品人人做人人综合 | 国产欧美日本一区二区三区| 国产一区二区三区| 九九热视频在线免费观看| 中文字幕一区二区三区蜜月| 99精品久久99久久久久| 欧美日韩综合在线| 日韩精品乱码免费| 日本成人午夜影院| 国产精品久久午夜| 99国产一区二区三精品乱码| 欧美亚洲一区三区| 视频一区二区欧美| 国产一区二区三区精品在线| 国产精品美女久久久久aⅴ国产馆| 成人一道本在线| 欧美午夜免费电影| 奇米影视一区二区三区| 男女男精品视频网站| 成人免费在线观看入口| 亚洲精品激情视频| 久久综合给合久久狠狠狠97色69| 国产成人自拍网| 欧美亚洲丝袜传媒另类| 日韩二区三区四区| 男人天堂资源网| 亚洲码国产岛国毛片在线| 国产女人18毛片水真多18| 精品99一区二区| zzijzzij亚洲日本少妇熟睡| 欧美美女视频在线观看| 久久成人18免费观看| 好吊色视频在线观看| 午夜精品久久久久久久久久| 快灬快灬一下爽蜜桃在线观看| 一区视频在线播放| 中文字幕乱视频| 国产亚洲欧洲一区高清在线观看| av激情成人网| 日韩欧美亚洲一区二区| 成人午夜激情在线| 欧美一级专区免费大片| 国产成人三级在线观看| 777奇米四色成人影色区| 国产毛片精品国产一区二区三区| 欧美午夜精品理论片a级按摩| 久久成人久久爱| 欧美特级限制片免费在线观看| 精品乱人伦小说| 成人欧美一区二区三区在线播放| 国产二级一片内射视频播放| 中文字幕 久热精品 视频在线| 手机免费看av片| 国产精品不卡一区| 亚洲永久精品ww.7491进入| 18成人在线视频| 亚洲а∨天堂久久精品2021| 亚洲精品免费在线| 日本视频在线免费| 日韩和欧美一区二区三区| 国产免费无码一区二区视频 | 亚洲在线中文字幕| 久久视频一区二区三区| 五月婷婷综合网| 日本高清成人免费播放| 国产在线精品一区二区三区不卡| 欧美日韩国产小视频| 丰满放荡岳乱妇91ww| 日韩欧美aaaaaa| 精品人妻一区二区乱码| 亚洲国产精品黑人久久久| 熟妇高潮精品一区二区三区| 亚洲黄色小说网站| 午夜精品福利在线视频| 精东粉嫩av免费一区二区三区| 69久久99精品久久久久婷婷| 成人激情免费网站| 国产午夜一区二区三区| 强伦人妻一区二区三区| 亚洲国产成人91porn| 色88888久久久久久影院野外| 国产精品一区2区| 精品国产一二三区| 亚洲一区二区三区四区五区六区| 亚洲自拍偷拍综合| 在线免费观看亚洲视频| 国产馆精品极品| 久久综合狠狠综合久久激情 | 日韩精品中文字幕一区二区三区| 俄罗斯女人裸体性做爰| 亚洲欧洲日产国产综合网| 国产大屁股喷水视频在线观看| 蜜臀精品久久久久久蜜臀 | 欧美国产激情一区二区三区蜜月 | 亚洲成人自拍偷拍| 在线观看一区二区精品视频| 成人av中文字幕| 中文字幕一区二区三区精华液| 精品在线观看一区| 国产精品香蕉一区二区三区| 国产亚洲欧美一级| 日韩欧美视频免费观看| 国产精品白丝jk黑袜喷水| 国产亚洲一区字幕| 懂色av蜜臀av粉嫩av永久| 国模一区二区三区白浆| 2017欧美狠狠色| 欧美黄色高清视频| 国产一区二区视频在线| 国产午夜精品一区二区三区嫩草 | 欧美日韩电影在线播放| 国产xxx在线观看| 亚洲国产欧美在线| 7777精品伊人久久久大香线蕉超级流畅| a级片在线观看视频| 丝袜美腿亚洲一区| 日韩一区二区三区视频| 中日韩精品一区二区三区| 欧美精品一级二级| 亚洲av成人片无码| 日本中文字幕一区二区视频 | 91精品免费在线| 欧美亚一区二区三区| 看电影不卡的网站| 国产性做久久久久久| 波多野结衣亚洲色图| 成人a级免费电影| 亚洲欧美日韩中文播放| 在线观看精品一区| 日本wwwwwww| 青青国产91久久久久久| 精品免费视频一区二区| 成人三级视频在线观看| 99re这里只有精品6| 婷婷久久综合九色综合绿巨人| 欧美成人免费网站| 人妻熟人中文字幕一区二区| 成人黄色综合网站| 亚洲色图欧洲色图婷婷| 欧美日韩在线直播| 在线免费看黄视频| 成人在线一区二区三区| 午夜欧美电影在线观看| 26uuu成人网一区二区三区| 黄色录像免费观看| 亚洲熟女一区二区三区| 麻豆成人综合网| 亚洲欧洲无码一区二区三区| 欧美人狂配大交3d怪物一区| 播金莲一级淫片aaaaaaa| 国产成人夜色高潮福利影视| 一区二区三区欧美在线观看| 精品少妇一区二区三区在线播放 | 亚洲欧美一区二区三区极速播放| 欧美久久久一区| 妺妺窝人体色WWW精品| eeuss鲁片一区二区三区在线观看| 亚洲第一激情av| 久久精品亚洲国产奇米99| 欧美日韩在线播| 国产主播av在线| aaa黄色大片| 国产毛片精品视频| 亚洲第一电影网| 国产欧美一区二区精品忘忧草| 欧美性感一区二区三区| 妺妺窝人体色WWW精品| 台湾佬美性中文| 国产毛片精品国产一区二区三区| 亚洲影视在线观看| 国产清纯美女被跳蛋高潮一区二区久久w| 欧美午夜电影网| 日本二区三区视频| 亚洲av网址在线| 91丨porny丨九色|