亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 openssl_public_decrypt 解密簽名

使用 openssl_public_decrypt 解密簽名

PHP
開心每一天1111 2023-10-22 21:27:42
我正在嘗試驗證對我們的一個端點的外部調用,該端點是由第三方觸發的,我們收到交易數據和基于該交易信息的簽名,因此,我們需要解密簽名并比較結果驗證真偽。我正在嘗試openssl_public_decrypt使用提供商的公鑰來解密簽名。這就是我正在嘗試的方式:$signature = 'GcTtinhU0YgwGbZPtBwLdh+zdEe0w0W95TFPggeHMCjeDUBWgZfCZ6ZDRUk7DfT5BkKsbAi8/4o60Krcwz1JMdRjmsPf7vj33heVIB2PZJaf8eFR1jijLIsyl4vgH7BbbQ2I6kk6IcYXYWPVAHYRWxl1pJwOyNxZPr49fdW+hcw2zbpkEmj2114QBSiV6eHLowVYKLvpuiT8zLc6DN/wVzCYBuR/cg+CPHgYMeWFsuvu9J46hm6Hij00E68ldYAqVwImlmHPqfqvdEItg3Oi0ac4tXH2nCNgLPHcyU/H32NzTYC9iT1YZkoInqsU6Qv64vbU9lSMS91EQBEa5UQkUg==';$pubKey = openssl_pkey_get_public('file://path/to/public.pem');if( openssl_public_decrypt(base64_decode($signature), $data, $pubKey)){  echo $data;}else{  echo 'Error';}我沒有收到任何錯誤,但該$data值不是我所期望的,是這樣的v_~?@&?W? ?q?&??uQ?????我確信我丟失了一些東西,但我無法找出它是什么,因為該$data值看起來像是加密的。我期望解密的結果是167619085f7ed94026e357930b18dc011971f226c898ef7551cdf6ec9ad694cf以下代碼的結果$canonical = 'c328e942-8be8-4104-abbe-048254f893dc|9687|2874.30|52409|BP1381|550bd8439cd1f41691671cdd4e8c6ae6';$hashed = hash('sha256', $canonical);最后一部分是提供者如何生成簽名。對于給定的示例,規范形式如下: cec4b9bf-5a39-4bd7-bc8b826ebc18208d|Internal_0005|12|39679|BP7610|947d589a40dece13c28f2b63c41ae451我們通過使用 SHA-256 對規范形式進行哈希處理并使用我們的私鑰對結果字節進行加密來對響應進行簽名。RSA_ENCRYPT(SHA256(canonicForm), privkey.key)要驗證有效負載,您必須重新計算規范形式并對結果應用 SHA-256。結果值必須與用我們的公鑰解密簽名參數的結果進行比較。任何提示將不勝感激。
查看完整描述

1 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

也許發布公鑰和一些有效的測試數據以便我們可以測試自己?

無論如何,v_~?@&?W??q?&??uQ?????這可能是一個有效的簽名,請記住 SHA256 是 256 個隨機位,它是二進制數據,不是 ASCII 數據,不是十六進制,并且不可打印。SHA256 也恰好是 32 個字節長(256 位,1 個字節是 8 位,256/8 是 32 個字節),因此如果您在解密后運行 var_dump(strlen($data)) ,它應該打印 32,如果是話不打印 32,這意味著他們正在使用填充方案,嘗試檢查 OPENSSL_PKCS1_PADDING 和 OPENSSL_NO_PADDING 的 strlen ,當您獲得正確的填充方案時,解密后的 strlen($data) 應該是 int(32)

但我最好的猜測是:

$signature = 'GcTtinhU0YgwGbZPtBwLdh+zdEe0w0W95TFPggeHMCjeDUBWgZfCZ6ZDRUk7DfT5BkKsbAi8/4o60Krcwz1JMdRjmsPf7vj33heVIB2PZJaf8eFR1jijLIsyl4vgH7BbbQ2I6kk6IcYXYWPVAHYRWxl1pJwOyNxZPr49fdW+hcw2zbpkEmj2114QBSiV6eHLowVYKLvpuiT8zLc6DN/wVzCYBuR/cg+CPHgYMeWFsuvu9J46hm6Hij00E68ldYAqVwImlmHPqfqvdEItg3Oi0ac4tXH2nCNgLPHcyU/H32NzTYC9iT1YZkoInqsU6Qv64vbU9lSMS91EQBEa5UQkUg==';


$canonical = 'c328e942-8be8-4104-abbe-048254f893dc|9687|2874.30|52409|BP1381|550bd8439cd1f41691671cdd4e8c6ae6';

$pubKey = openssl_pkey_get_public('file://path/to/public.pem');


if( openssl_public_decrypt(base64_decode($signature), $data, $pubKey)){

  echo "signature decryption success! ";

  if(hash_equals(hash("sha256",$canonical,true),$data)){

    echo "checksum verification success!";

  } else{

    echo "checksum verification failed (after decryption was successful..)";

  }

}else{

  echo 'checksum decryption error';

}

但再次嘗試兩者


if( openssl_public_decrypt(base64_decode($signature), $data, $pubKey, OPENSSL_PKCS1_PADDING)){


if( openssl_public_decrypt(base64_decode($signature), $data, $pubKey, OPENSSL_NO_PADDING)){

其中 1 個可能是正確的(當正確時, var_dump(strlen($data)) 應該打印 int(32) )


查看完整回答
反對 回復 2023-10-22
  • 1 回答
  • 0 關注
  • 220 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號