.pfx證照檔案的PHP使用——RSA驗證機制

weixin_34413065發表於2017-08-25

今天公司遇到一個支付專案 對方給過來的介面使用的是RSA驗證 給到了一個.pfx的證照,頓時懵逼 馬上問Google PHP RSA怎麼玩的,結果網上都是一堆複製貼上的東西 毫無營養。都說要什麼轉成.pem的檔案形式才行,害得我搞了半天終於可以實現加密了,但是問題出現了,加密出來的字串和介面提供方給過來的加密字串示例不一樣,明顯是不通的。自己又是翻PHP幫助文件,又是瞎折騰 終於搞定了 很多支付類 銀行介面都要用這種形式的驗證 ,不多說 程式碼如下

<?php
    /**
     * 生成簽名前的字串
     *
     * @param $params
     * @return string
     */
    function getParamsString($params)
    {
        if (!is_array($params))
            $params = array();
        ksort($params);
        $str = '';
        foreach ($params as $k => $v) {
            $str .= $v != ''?$k . $v:'';
        }
        return $str;
    }
/**
 * 根據原文生成簽名內容
 *
 * @param string $data 原文內容
 *
 * @return string
 */
function sign($data)
{
    $filePath = 'private.pfx';
    if(!file_exists($filePath)) {
        return false;
    }
    $pkcs12 = file_get_contents($filePath);
    if (openssl_pkcs12_read($pkcs12, $certs, '讀取證照所需要的密碼')) {
        $privateKey = $certs['pkey']; //根據實際情況鍵值可能不同
        $binary_signature = "";
        if (openssl_sign(utf8_encode($data), $binarySignature, $privateKey, OPENSSL_ALGO_SHA1)) {
            return bin2hex($binarySignature);
        } else {
            return '';
        }
    } else {
        return '';
    }
}
/**
 * 驗證簽名自己生成的是否正確
 *
 * @param string $data 簽名的原文
 * @param string $signature 簽名
 *
 * @return bool
 */
function verifySign($data, $signature)
{
    $filePath = 'private.pfx';
    if(!file_exists($filePath)) {
        return false;
    }

    $pkcs12 = file_get_contents($filePath);
    if (openssl_pkcs12_read($pkcs12, $certs, '讀取證照所需要的密碼')) {
        $publicKey = $certs['cert'];
        $ok = openssl_verify($data, hex2bin($signature), $publicKey);
        if ($ok == 1) {
            return true;
        }
    }
    return false;
}
/**
 * 驗證返回的簽名是否正確
 * @filePath 為cer檔案路徑
 * @param string $data 要驗證的簽名原文
 * @param string $signature 簽名內容
 *
 * @return bool
 */
function verifyRespondSign($data, $signature)
{
    $filePath = 'public.cer';
    if(!file_exists($filePath)) {
        return false;
    }

    $cert = file_get_contents($filePath);
$$pubKeyId = openssl_get_publickey($cert);
    
    $signature = hex2bin($signature);
    $ok = openssl_verify(utf8_encode($data), $signature, $pubKeyId);

    if ($ok == 1) {
        openssl_free_key($pubkeyid);
        return true;
    }
    return false;
}
?>

相關文章