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

背景

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

实现方式

  • 签名加密、解密代码:
    /*** @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;}
  • 签名加密,操作举例
/*** 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);

附录

① . 参考文章

    1. php 实现SHA256WithRSA
    1. PHP sha256WithRsa加解密
    1. openssl_sign(): supplied key param cannot be coerced into a private key

②. GuzzleHttp 使用技巧

    1. 实例化类 Client

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

//实例化 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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL常用命令

一.数据类型 MySQL中有多种数据类型,每种类型用于存储不同类型的数据。以下是MySQL中常见的数据类型: 数值类型: INT:整数类型,存储范围为-2,147,483,648到2,147,483,647。BIGINT:大整数类型,存…

【蓝桥杯选拔赛真题63】Scratch云朵降雨 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch云朵降雨 一、题目要求 编程实现 二、案例分析 1、角色分析

AHH HackerHouse @Move大理站完美谢幕

Antalpha HackerHouse Move 大理站于2023年9月23日在面包树举办了Final DemoDay,这也代表着为期21天的 HackerHouse 活动完美谢幕。 自从9月3日开始,整整21天的共居时间里,我们从个体逐渐融汇成小团队,最终成为了一个紧密团结的大…

算法通关村-----寻找祖先问题

最近公共祖先 问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一…

UI自动化测试 | Jenkins配置优化

前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家。 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化测试和性能测试&…

软件测试之单元测试自动化入门基础

单元测试自动化 所谓的单元测试(Unit Test)是根据特定的输入数据,针对程序代码中的最小实体单元的输入输出的正确性进行验证测试的过程。所谓的最小实体单元就是组织项目代码的最基本代码结构:函数,类,模块等。在Python中比较知名…

OpenHarmony自定义组件介绍

一、创建自定义组件 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑…

安装ipfs-swarm-key-gen

安装ipfs-swarm-key-gen Linux安装go解释器安装ipfs-swarm-key-gen Linux安装go解释器 https://blog.csdn.net/omaidb/article/details/133180749 安装ipfs-swarm-key-gen # 编译ipfs-swarm-key-gen二进制文件 go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm…

Redis代码实践总结(二)

使用 CLI 探索 Redis 外部程序使用 TCP 套接字和 Redis 特定协议与 Redis 进行通信。该协议在不同编程语言的 Redis 客户端库中实现。然而,为了使使用 Redis 进行黑客攻击变得更简单,Redis 提供了一个命令行实用程序,可用于向 Redis 发送命令…

odoo16 取消“系统各功能状态日报”的邮件

odoo16默认情况下每周都会发送一个“系统各功能状态日报”的邮件,而且是所有人都发, 这个功能在哪配置呢? 今天研究了一下, 线索是“系统各功能状态日报”,先全文检索吧 #. module: digest #: model:digest.digest,na…

KUKA机器人通过3点法设置工作台基坐标系的具体方法

KUKA机器人通过3点法设置工作台基坐标系的具体方法 具体方法和步骤可参考以下内容: 进入主菜单界面,依次选择“投入运行”—“测量”—基坐标,选择“3点法”, 在系统弹出的基坐标编辑界面,给基座标编号为3,命名为table1,然后单击“继续”按钮,进行下一步操作, 在弹出的…

批量删除wordpress文章修订版本/自动草稿残留数据(3种方法)及四种方法禁用WordPress文章历史修订/自动保存/自动草稿功能

目录 1、批量删除wordpress文章修订版本/自动草稿残留数据(3种方法) 方法一:SQL命令批量删除 命令: 方法二:利用PHP代码来删除 方法三:利用数据库清理优化插件 WP Clean Up 或 WP Cleaner 批量删除 2…

【STM32基础 CubeMX】从0带你点灯

文章目录 前言一、GPIO的概念二、CubeMX配置GPIO2.1 基础配置2.2 GPIO配置 三、点灯代码讲解3.1 cubemx生成的代码3.2 1个库函数 四、LED闪烁总结 前言 一、GPIO的概念 STM32是一系列微控制器芯片的品牌,它们用于控制各种电子设备。其中的GPIO是通用输入/输出端口的…

在优化问题里,强化学习相比启发式算法有什么好处?

本文出自https://mp.weixin.qq.com/s/J1SsNtU1wkqdGcKZvNACHw纯属个人科研收餐使用 存在部分数学符号和公式,都可通过上面链接查看!!!! 关于强化学习和传统优化算法(包括:数学优化,启发式,元启发式)的探讨越来越多了,很多同学可能是一上来就集中在一个方向和方法上,…

触觉智能 PurPle Pi OH(OpenHarmony)开发板

资料汇总 内容预览 产品介绍 PurPle-Pi OH 规格书​​​​​​ 系统编译 Purple-Pi-OH Linux SDK编译 Purple-Pi-OH OHOS SDK编译 使用手册 Purple-Pi-OH Ubuntu系统使用手册 常见FAQ 常见问题 官网 官网地址 Purple Pi OH介绍 Purple Pi OH作为一款兼容树莓派的开…

Hive【Hive(三)查询语句】

前言 今天是中秋节,早上七点就醒了,干啥呢,大一开学后空教室紧缺,还不趁着假期来学校等啥呢。顺便偷偷许个愿吧,希望在明年的这个时候,秋招不知道赶不赶得上,我希望拿几个国奖,蓝桥杯…

Spring结合自定义注解实现 AOP 切面功能

Spring结合自定义注解实现 AOP 切面功能 Spring AOP 注解概述Aspect 快速入门execution 切点表达式 拦截指定类的方法Pointcut("annotation(xx)") 拦截拥有指定注解的方法环绕通知 实现开关目标方法案例1:自定义注解切面实现统一日志处理1.自定义日志注解…

多线程总结(线程池 线程安全 常见锁)

本篇文章主要是对线程池进行详解。同时引出了单例模式的线程池,也对线程安全问题进行了解释。其中包含了智能指针、STL容器、饿汉模式的线程安全。也对常见的锁:悲观锁(Pessimistic Locking)、乐观锁(Optimistic Locki…

brew 安装MySQL 5.7

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

openlayers-18-聚合显示补充(切换聚合与非聚合状态)

最近有一些网友问我&#xff0c;聚合显示怎么实现聚合与不聚合之间的切换&#xff0c;有很多方法能够实现&#xff0c;下面是一个示例作为参考。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-…