前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP 实现 SHA256 with RSA 签名 (实例讲解)

PHP 实现 SHA256 with RSA 签名 (实例讲解)

作者头像
泥豆芽儿 MT
发布2023-10-16 19:20:21
9830
发布2023-10-16 19:20:21
举报
文章被收录于专栏:木头编程 - moTzxx

背景

  • 近期在对接 美餐支付 接口文档时, 重点需根据 sha256WithRSA 签名规则,进行加密处理 通过参考网上的签名经验,最后整理出适合自己业务使用的处理方法 欢迎各位指摘 …

实现方式

  • 签名加密、解密代码:
代码语言:javascript
复制
    /**
     * @Notes:生成 sha256WithRSA 签名
     * 提示:SPKI(subject public key identifier,主题公钥标识符)
     * @param null $signContent     待签名内容
     * @param string $privateKey    私钥数据(如果为单行,内容需要去掉RSA的标识符)
     * @param bool $singleRow       是否为单行私钥-标识
     * @return string               签名串
     * @User: zhanghj
     * @DateTime: 2023-09-27 9:41
     */
    public function getSHA256SignWithRSA($signContent = null, $privateKey = '', $singleRow = false){
        if ($singleRow){
            //如果传入的私钥是单行数据,且没有RSA的标识符,需做格式转化
            $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" .
                          wordwrap($privateKey, 64, "\n", true) .
                          "\n-----END RSA PRIVATE KEY-----";
        }
        $key = openssl_get_privatekey($privateKey);
        //开始加密
        openssl_sign($signContent, $signature, $key, OPENSSL_ALGO_SHA256);
        //进行 base64编码 加密后内容
        $encryptedData = base64_encode($signature);
        openssl_free_key($key);
        return $encryptedData;
    }

    /**
     * @Notes:验证 sha256WithRSA 签名
     * @param null $signContent     待签名内容
     * @param string $signatureStr  签名串
     * @param string $public_key    公钥数据(如果为单行,内容需要去掉RSA的标识符)
     * @param bool $singleRow       是否为单行私钥-标识
     * @return int                  1:签名成功,0:签名失败
     * @User: zhanghj
     * @DateTime: 2023-09-27 10:38
     */
    public static function verifySha256SignWithRSA($signContent = null, $signatureStr = '', $public_key = '',$singleRow = false)
    {
        if ($singleRow){
            $public_key = "-----BEGIN PUBLIC KEY-----\n" .
                wordwrap($public_key, 64, "\n", true) .
                "\n-----END PUBLIC KEY-----";
        }
        $key = openssl_get_publickey($public_key);
        $ok = openssl_verify($signContent, base64_decode($signatureStr), $key, OPENSSL_ALGO_SHA256);
        openssl_free_key($key);
        return $ok;
    }
  • 签名加密,操作举例
代码语言:javascript
复制
/**
 * 1. 如果得到的 私钥数据,没有RSA标识符,此时,要求私钥为【单行】形式
 */
$signature_res = self::getSHA256SignWithRSA($sign_str,$this->private_key,true);

/**
 * 2. 如果得到的 私钥数据,拥有RSA标识符,此时,要求私钥为标准的形式(每行64个字符)
 */
$signature_res = self::getSHA256SignWithRSA($sign_str,$this->private_key,false);

/**
 * 3. 如果得到的 私钥数据,是以 pem文件形式存储,此时,需先加载指定目录的 pem文件
 */
// 加载私钥文件
$this->private_key = openssl_pkey_get_private(file_get_contents(self::KEY_FILE_DIR.'rsa_private.pem'));        
$signature_res = self::getSHA256SignWithRSA($sign_str,$this->private_key,false);

附录

① . 参考文章

②. GuzzleHttp 使用技巧

    1. 实例化类 Client

配置参数 http_errors 可解决 401 授权问题

代码语言:javascript
复制
//实例化 Client
$httpClient = new Client([
            'base_uri' => self::BASE_URL,
            'verify' => false,
            'http_errors' => false]);

//请求传参            
$options = [
                'timeout' => 5,
                //传输 headers
                'headers' => $header_data,
            ];
            
//判断请求方式
if ($request_method == 'GET'){
    $options['query'] = $request_body;
}else{
    //参数需在请求JSON传参
    //$options['form_params'] = $request_body;
    $options['json'] = $request_body;
}

//请求目标接口,处理反馈信息
$response  = $this->httpClient->request($request_method,$url,$options);
$contents = $response->getBody().'';
$opData = json_decode($contents,true);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 实现方式
  • 附录
    • ① . 参考文章
      • ②. GuzzleHttp 使用技巧
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档