Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP 实现 SHA256 with RSA 签名 (实例讲解)

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

作者头像
泥豆芽儿 MT
发布于 2023-10-16 11:20:21
发布于 2023-10-16 11:20:21
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

背景

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

实现方式

  • 签名加密、解密代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * @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
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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
代码运行次数:0
运行
AI代码解释
复制
//实例化 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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
美餐支付 - PHP代碼实现
泥豆芽儿 MT
2024/01/10
3160
美餐支付 - PHP代碼实现
使用PHP实现RSA或RSA2算法的签名和验签
 使用RSA算法除了加密解密之外(加密解密的代码可以查看本站PHP使用RSA算法加密解密数据 这篇文章),在支付等接口方面通常还会用到生成签名和验证签名操作,下面是PHP代码:
友儿
2022/09/09
9210
php实现rsa签名和验签
这两天在弄某支付接口相关的东西,以前没做过这块,在签名和验签的过程中遇到了一些问题,记下来. 首先生成一个1024位的私钥: openssl genrsa -out private.pem 1024 然后根据私钥导出公钥 openssl rsa -in private.pem -pubout -out public.pem php的openssl扩展里已经封装好了签名和验签的方法,分别是openssl_sign和openssl_verify. function sign($data){ $p = o
码农二狗
2018/06/29
2.6K0
RSA加密解密(无数据大小限制,php、go、java互通实现)
RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内容进行分段。
双鬼带单
2019/07/30
5.1K0
golang实现RSA2的签名与验签函数
使用非对称加密算法,实现签名与验签 package tools import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "encoding/base64" "encoding/pem" "errors" ) // RSA2私钥签名 func Rsa2PriSign(signContent string, privateKey string, ha
唯一Chat
2022/11/12
1.3K0
golang实现RSA2的签名与验签函数
PHP实现的MD5结合RSA签名算法实例
本文实例讲述了PHP实现的MD5结合RSA签名算法。分享给大家供大家参考,具体如下:
用户2323866
2021/07/09
1K0
Python 实现RSA SHA-1签名
今天对接业务接口,传递的参数需要用RSA签名,三方只给了java的RSA签名Demo;但我们这边后端采用python开发,因此需要用Python来实现RSA签名。
py3study
2020/01/07
1.9K0
python自行实现支付宝证书签名&验签全流程[通俗易懂]
这里不得不吐槽下支付宝文档,自行实现签名全给的是参考java sdk实现,网上证书签名和验签文章也没几篇。这里给大家分享下自己实现的全过程,希望能够避免大家少踩点坑。 最后ps:若是支付宝官方觉得我这篇python自行实现支付宝证书签名和验签可以给用户当做参考的话,拿走不谢,哈哈!!!
全栈程序员站长
2022/08/26
1.5K0
RSA 签名/验签 (PHP为例),以及各个秘钥格式解析
躺平程序员老修
2023/09/05
1.2K0
.NET Core 使用RSA算法 加密/解密/签名/验证签名
前言 前不久移植了支付宝官方的SDK,以适用ASP.NET Core使用支付宝支付,但是最近有好几位用户反应在Linux下使用会出错,调试发现是RSA加密的错误,下面具体讲一讲。 RSA在.NET Core的改动 以前我们使用RSA加密主要是使用RSACryptoServiceProvider这个类,在.NET Core中也有这个类,但是这个类并不支持跨平台,所以如果你是用这个类来进行加/解密在windows上运行是完全没有错误的,但是只要你一放到Linux下就会出现异常。 查阅资料得知,要解决这个问题,需
晓晨
2018/06/22
4.1K0
RSA密文过长加密解密 越过1024的解决代码
RSA (详见维基百科)算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法,与 md5 和 sha1 不同,到目前为止,也只有极短的RSA加密被破解。
Tinywan
2019/07/16
5.1K0
python RSA签名
这周一个项目客户提供了一份对接文档要求用RSA数字签名,客户提供的是java的demo,但是自己不想用java来做,想用python来实现,就自己研究了下python下RSA签名。
py3study
2020/01/08
1.3K0
php生成数字签名的几种方法
HMAC(散列消息认证码) 使用密钥和散列函数对消息进行加密,并用结果生成一个数字签名。
超级小可爱
2024/02/24
7990
区块链基础:非对称算法
1.Hash算法 package cn.hadron.security; import java.security.MessageDigest; import java.util.UUID; import org.eclipse.jetty.util.security.Credential.MD5; /** * crypto['krɪptoʊ]秘密成员, * 一些语言的crypto模块的目的是为了提供通用的加密和哈希算法 * 加密工具类 */ public class CryptoUtil
程裕强
2022/05/06
4290
区块链基础:非对称算法
java下使用openssl生成公私钥
compatible with the PKCS#1 RSAPrivateKey or SubjectPublicKeyInfo format.
sabergo
2019/02/21
2.7K0
java下使用openssl生成公私钥
PHP的OpenSSL加密扩展学习(二):非对称加密
上篇文章,我们了解了关于对称和非对称加密的一些相关的理论知识,也学习了使用 OpenSSL 来进行对称加密的操作。今天,我们就更进一步,学习 OpenSSL 中的非对称加密是如何实现的。
硬核项目经理
2020/11/10
9400
java中的签名和证书那些事
数字签名,简单来说就是通过提供 可鉴别 的 数字信息 验证 自身身份 的一种方式。一套 数字签名 通常定义两种互补的运算,一个用于 签名,另一个用于 验证。分别由 发送者 持有能够 代表自己身份 的 私钥 (私钥不可泄露),由 接受者 持有与私钥对应的 公钥 ,能够在 接受 到来自发送者信息时用于 验证 其身份。签名 最根本的用途是要能够唯一 证明发送方的身份,防止 中间人攻击、CSRF跨域身份伪造。基于这一点在诸如 设备认证、用户认证、第三方认证 等认证体系中都会使用到签名算法。
山行AI
2019/06/28
1.7K0
如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定
加密是指利用某个值(密钥)对明文的数据通过一定的算法变换加密(密文)数据的过程,它的逆向过程叫解密。
用户8949263
2022/04/08
6K0
如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定
基础入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA
密文-有源码直接看源码分析算法(后端必须要有源码才能彻底知道) 密文-没有源码1、猜识别 2、看前端JS(加密逻辑是不是在前端) #算法加密-概念&分类&类型
没事就要多学习
2024/07/18
2130
基础入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA
API签名设计(php版)
API签名设计 可变性 每次的签名必须是不一样的。 时效性 每次请求的时效,过期作废等。 唯一性 每次的签名是唯一的。 完整性 能够对传入数据进行验证,防止篡改。 步骤 将所有参数(注意是所有参数),除去sign本身,以及值是空的参数,按参数名字母升序排序。 然后把排序后的参数按参数1值1参数2值2…参数n值n(这里的参数和值必须是传输参数的原始值,不能是经过处理的)的方式拼接成一个字符串。 把分配给接入方的验证密钥key拼接在第2步得到的字符串前面。 在上一步得到的字符串前面加上验证密钥key(这
友儿
2022/09/11
1.5K0
相关推荐
美餐支付 - PHP代碼实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档