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