php基于sha1withRSA算法的簽名和驗(yàn)簽(pfx證書(shū))
作者: 鄭曉 分類: PHP 發(fā)布于: 2016-06-21 17:58 瀏覽:40,839 評(píng)論(13)
在和第三方支付接口對(duì)接時(shí)經(jīng)常會(huì)對(duì)數(shù)據(jù)進(jìn)行簽名和驗(yàn)簽,sha1WithRSA也算是比較常用的一種簽名加密算法。php開(kāi)啟openssl庫(kù)后實(shí)現(xiàn)起來(lái)也算比較簡(jiǎn)單。
我在這里使用sha1withRSA算法來(lái)實(shí)現(xiàn)數(shù)據(jù)的加密簽名和驗(yàn)簽,其中公鑰和私鑰均讀取自接口方提供的.pfx證書(shū)文件。
以下是使用私鑰進(jìn)行簽名的代碼示例,注意其中在return前對(duì)生成的簽名密文進(jìn)行base64編碼:
/**
* 簽名 生成簽名串 基于sha1withRSA
* @param string $data 簽名前的字符串
* @return string 簽名串
* @link yjfs.org.cn
*/
function sign($data) {
$certs = array();
openssl_pkcs12_read(file_get_contents("你的.pfx文件路徑"), $certs, "password"); //其中password為你的證書(shū)密碼
if(!$certs) return ;
$signature = '';
openssl_sign($data, $signature, $certs['pkey']);
return base64_encode($signature);
}
驗(yàn)簽時(shí)使用公鑰,也就是.pfx文件中的cert KEY:
/**
* 驗(yàn)簽 驗(yàn)證簽名 基于sha1withRSA
* @param $data 簽名前的原字符串
* @param $signature 簽名串
* @return bool
* @link yjfs.org.cn
*/
function verify($data, $signature) {
$certs = array();
openssl_pkcs12_read(file_get_contents("你的.pfx文件路徑"), $certs, "password");
if(!$certs) return ;
$result = (bool) openssl_verify($data, base4_decode($signature), $certs['cert']); //openssl_verify驗(yàn)簽成功返回1,失敗0,錯(cuò)誤返回-1
return $result;
}
本文采用知識(shí)共享署名-非商業(yè)性使用 3.0 中國(guó)大陸許可協(xié)議進(jìn)行許可,轉(zhuǎn)載時(shí)請(qǐng)注明出處及相應(yīng)鏈接。
本文永久鏈接: http://yjfs.org.cn/php-sha1withrsa-sign-verify-pfx.html
請(qǐng)問(wèn)下,驗(yàn)簽跟證書(shū)域名有關(guān)嗎,為什么我使用您的方法,驗(yàn)簽返回的是0呢
可能證書(shū)路徑不正確、密碼不正確、不是PKCS#12格式的證書(shū)
路徑和密碼都是正確的,已經(jīng)打印出了公私鑰了,證書(shū)是PKCS#12格式的證書(shū),有2個(gè)證書(shū),一個(gè)是自制pfx證書(shū),一個(gè)是找西部數(shù)碼買的pfx證書(shū)
路徑和密碼都是正確的,已經(jīng)打印出了公私鑰了,證書(shū)是PKCS#12格式的證書(shū),有2個(gè)證書(shū),一個(gè)是自制pfx證書(shū),一個(gè)是找西部數(shù)碼買的pfx證書(shū),測(cè)試了都不行,請(qǐng)問(wèn)下您方便發(fā)一個(gè)你的pfx證書(shū)給我,我測(cè)試一下嗎
抱歉,是我的鍋。。。簽名時(shí),把返回的簽名數(shù)據(jù)用base64轉(zhuǎn)碼了,所以在驗(yàn)簽時(shí)$signature也 需要base64_decode。文中已經(jīng)修改。。。