旗下导航:搜·么
当前位置:网站首页 > PHP教程 > 正文

用PHP完成SHA1withRSA署名、加密、考证【php教程】

作者:搜搜PHP网发布时间:2019-11-26分类:PHP教程浏览:95


导读:网上看到有PHP大牛分享的PHP的署名加密代码,转来和人人一同分享一下,感兴趣的小伙伴来相识一下吧。观点诠释:SHA1平安哈希算法重要适用于数字署名规范内里定义的数字署...
网上看到有PHP大牛分享的PHP的署名加密代码,转来和人人一同分享一下,感兴趣的小伙伴来相识一下吧。

观点诠释:

SHA1平安哈希算法重要适用于数字署名规范内里定义的数字署名算法。

RSA是现在最有影响力的公钥加密算法,它能够反抗到现在为止已知的绝大多数暗码进击,已被ISO引荐为公钥数据加密规范。

SHA1WithRSA:用SHA算法举行署名,用RSA算法举行加密。

营业要求:

每一个署名组装的内容是按字段名的字典递次升序排序衔接的

先组装须要署名的内容:

/**
     * 拼接须要署名的内容
     * Author: Tao.
     *
     * @param array $data 需署名的字段内容
     * 
     * @return string
     */     
    public static function getSign($data)
    {
        foreach ($data as $k => $v) {
            $Parameters[$k] = $v;
        }
        //按字典序排序参数
        ksort($Parameters);
        $sign = '';
        foreach ($Parameters as $k => $v) {
            $sign .= $k . "=" . $v . "&";
        }
        $sign = '&' . rtrim($sign, '&');
        return $sign;
    }

署名字符串以下示例:
&amount=amount 值&ccy=ccy 值 &merchantId=merchantId 值&notifyUrl=notifyUrl 值&orderId=orderId 值 &payeeAcctNo=payeeAcctNo 值(明文)。

要注意的是,依据营业须要挑选,是不是在署名内容前拼接 &符。

然后生成秘钥署名:

/**
     * 秘钥加密
     * Author: Tao.
     *
     * @param string $data 之前生成好的需加密内容
     * @param $key 私钥证书位置(.pfx文件)
     * @param string $pwd 证书暗码
     *
     * @return string
     */
    public static function SHA1withRSA($data, $key,$pwd)
    {
        openssl_pkcs12_read(file_get_contents($key), $certs, $pwd); 
        if (!$certs) return;
        $signature = '';
        openssl_sign($data, $signature, $certs['pkey']);
        return bin2hex($signature);  
    }

因为第三方公司要求转换运用16进制,可依据需求挑选bin2hex()或base64_encode()。

这里要注意的是,依据营业须要,署名后的内容是不是要求大小写敏感。

署名后的内容应该是小写的,能够运用strtoupper()转换成大写。

以上就是给人人整理好的私钥加密要领。

但此营业中另要求将银行卡号须要举行RSA公钥加密
以下是猎取公钥的要领:
此处是猎取对方平台证书的公钥(.cer文件)


/**
     * 猎取公钥
     * Author: Tao.
     *
     * @param $path //公钥证书位置 (.cer文件)
     *
     * @return mixed
     * @throws \Exception
     */
    public static function loadCert($path)
    {
        $file = file_get_contents($path);
        if (!$file) {
            throw new \Exception('loadx509Cert::file_get_contents ERROR');
        }

        $cert = chunk_split(base64_encode($file), 64, "\n");
        $cert = "-----BEGIN CERTIFICATE-----\n" . $cert . "-----END CERTIFICATE-----\n";

        $res = openssl_pkey_get_public($cert);
        $detail = openssl_pkey_get_details($res);
        openssl_free_key($res);

        if (!$detail) {
            throw new \Exception('loadX509Cert::openssl_pkey_get_details ERROR');
        }
        return $detail['key'];
    }

    /**
     * 公钥加密
     * Author: Tao.
     * 
     * @param $pubPath  //公钥证书位置 (.cer文件)
     * @param string $bankCode //银行卡号
     * 
     * @return string
     */
    public static function rsa_encode($bankCode,$pubPath)
    {
        $pubkey = self::loadCert($pubPath);
        $encrypt_data = '';
        openssl_public_encrypt($bankCode, $encrypt_data, $pubkey);
        $encrypt_data = base64_encode($encrypt_data);
        return $encrypt_data;
    }

你要问我为何私钥是bin2hex(),公钥换了base64_encode()。我也不知道为何,问过说是16位,然则要求署名一向失利,换了64胜利了。对方说文档太老了,忘记了。。依据须要挑选吧

末了回调效果验签

起首先将回调数据中组装署名字段的内容取出来,按上面的getSign()要领排序。
然后举行考证:

/**
     * 考证返回的署名是不是准确
     *
     * @param string $data 要考证的署名原文
     * @param string $signature 署名内容
      *@param $pubPath  公钥证书位置 (.cer文件)
     *
     * @return bool
     */
    public static function verifyRespondSign($data, $signature,$pubPath)
    {
        $keys = self::loadCert($pubPath);
        $signature = hex2bin($signature);
        $ok = openssl_verify($data, $signature, $keys);
        if ($ok == 1) {
            return true;
        }
        return false;
    }

愿望对列位有协助,有不对的地方请指出,实时修正,互相学习。相干教程:PHP视频教程

以上就是用PHP完成SHA1withRSA署名、加密、考证的细致内容,更多请关注ki4网别的相干文章!

标签:PHPHA1withRSA签名加密验证