签名算法SHA256withRSA,RSA数字证书公钥私钥生成

"SHA256withRSA" 是一种签名算法,结合了 SHA-256 哈希算法和 RSA 加密算法。

RSA数字证书公钥密钥生成:

在Linux系统下运行以下命令生成:

如果提示输出密码,可以为空,直接回车

生成的公钥rsa_public_key.pem和密钥rsa_private_key.pem文件在当前目录下

# openssl

# genrsa -out rsa_private_key.pem 2048 Generating RSA private key, 2048 bit long modulus

# pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

# rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

 签名算法sha256withrsa:

$string:需要加密的字符串
$binary_signature:加密后保存到该变量中
$this->privateKey:RSA的私钥。(使用file_get_contents()读取私钥文件获取);

openssl_sign($string, $binary_signature, $this->privateKey, OPENSSL_ALGO_SHA256);

实例:

签名算法使用sha256withrsa算法,我方和渠道伙伴需交换RSA数字证书公钥用于验证签名,签名时,使用RSA数字证书私钥对签名参数串进行签名,RSA密用2048位及以上的,将签名值使用BASE64转码后填充到报文的数字签名域(Signature)。验证签名时,使用对方颁发的RSA数字证书公钥进行验签

/**
     * 签名 + post请求
     * @param array $param 请求参数
     * @param string $method 第三方方法名
     * @param string $api_method 接口名
     * @param string $is_big 通道别名
     * @param int $phone 手机号码
     * @return mixed
     */
    public function sign_post($param, $method, $api_method, $is_big, $phone)
    {
        $param['reqTime'] = date('YmdHis');
        $param['partnerId'] = $this->partnerId;
        $this->log($param, $api_method, $is_big, '签名前数据:', $phone);

        $signature = $this->makeSign($param);
        $this->log($signature, $api_method, $is_big, '签名值:');

        $param['signature'] = $signature;

        $types = explode('_',$api_method);
        if($types[0] == 'sk'){
            $requestUrl = $this->edUrl . $method;
        }else{
            $requestUrl = $this->zdUrl . $method;
        }

        $this->log($requestUrl, $api_method, $is_big, '请求url:');
        $this->log($param, $api_method, $is_big, '请求报文:');
        $res = $this->curl($requestUrl, $param);
        $this->log($res, $api_method, $is_big, '响应报文:');

        return $res;
    }

    /**
     * 生成签名
     * @param $params     array 请求参数
     * @param $privateKey string 秘钥
     * @return $sign string 签名内容
     */
    public function makeSign($params)
    {
        //签名步骤一:按字典序排序参数,再把所有数组值以“&”字符连接起来
        ksort($params);
        $string = $this->toUrlParams($params);

        openssl_sign($string, $binary_signature, $this->privateKey, OPENSSL_ALGO_SHA256);
        $sign = base64_encode($binary_signature);

        return $sign;
    }

    /**
     * 格式化参数格式化成url参数
     * @param $params array
     */
    public function toUrlParams($params)
    {
        $buff = "";
        foreach ($params as $k => $v) {
            if ($v != "" && !is_array($v)) {
                $buff .= $k . "=" . $v . "&";
            }
        }

        $buff = trim($buff, "&");

        return $buff;
    }

    //接口post请求
    public function curl($url = '', $data = '')
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        if (!empty($data)) {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //超时时间30秒
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);

        return $output;
    }

    /**
     * 验签
     * @param $data  array 需要验签的数据
     */
    public function verifySign($data, $publicKey)
    {

        if (empty($data) || empty($data['signature'])) {
            return false;
        }

        $sign = $data['signature'];
        unset($data['signature']);

        ksort($data);
        $string = $this->ToUrlParams($data);

        $pubKey = "-----BEGIN PUBLIC KEY-----\n" .
            wordwrap($publicKey, 64, "\n", true) .
            "\n-----END PUBLIC KEY-----";


        $result = (bool)openssl_verify($string, base64_decode($sign), $pubKey, OPENSSL_ALGO_SHA256);

        return $result;
    }

    /**
     * 日志记录
     * @param $data /内容
     * @param $method /方法名
     * @param $phone /手机号
     * @param string $is_big /通道别名
     * @param string $title /标题
     */
    public function Log($data, $method, $is_big, $title, $phone = '')
    {
        $str = is_array($data) ? json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $data;
        if (empty($phone)) {
            $content = '【' . date('Y-m-d H:i:s') . '】' . $title . $str . PHP_EOL;
        } else {
            $content = ' phone:' . $phone . '【' . date('Y-m-d H:i:s') . '】' . $title . $str . PHP_EOL;
        }
        $path = APPPATH . "../PAYLOG/$is_big/$method/";

        if (!is_dir($path)) { //判断目录是否存在 不存在就创建
            mkdir($path, 0777, true);
        }
        file_put_contents($path . date("Y-m-d") . '.txt', $content, FILE_APPEND);
        //换行分割
        file_put_contents($path . date("Y-m-d") . '.txt', '------------------------' . PHP_EOL, FILE_APPEND);
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
国际算法SHA256withRSA是一种基于SHA256哈希算法RSA非对称加密算法的数字签名算法。它使用SHA256对待签名的数据进行哈希计算,然后使用RSA算法对哈希值进行加密。这种算法通常用于数据的加密和数字签名验证,可以确保数据的完整性和身份的真实性。通过私钥对数据进行签名,然后使用公钥进行验签,可以确保数据在传输过程中没有被篡改,并且确保数据的发送方身份的真实性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java SHA256withRSA,json数据证书加签验签](https://download.csdn.net/download/sunny_lv/12786779)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [签名算法sha256withrsaRSA数字证书公钥私钥生成,base64转码和文件日志](https://blog.csdn.net/qq_41912505/article/details/107640004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [PHP MD5withRSA、SHA1withRSASHA256withRSA算法签名](https://blog.csdn.net/xiayu204575/article/details/106589772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值