PHP在做api开发中,RSA加密签名算法如何使用 ?

RSA 加密是什么

RSA(Rivest-Shamir-Adleman)是最早的公钥密码系统之一,广泛用于安全数据传输。3 位数学家 Rivest、Shamir 和 Adleman 的名字来命名的。

是非对称加密的一种 这种算法非常可靠,密钥越长,它就越难破解。

在这样的密码系统中,加密密钥是公共的,并且它与保密(私有)的解密密钥不同

加密

RSA 密码体制是一种公钥密码体制,加密算法公开,以分配的密钥作为加密解密的关键

一般来说,在一对公私钥中,公钥和私钥都可以用来加密和解密,即公钥加密能且只能被对应的私钥进行解密

私钥加密能且只能被对应的公钥进行解密。

一般我们都是把公钥公开出去 如果我们是服务方 一般我们是拿私钥加密 接收方来拿公钥进行验签等

为了保证加密安全 建议 RSA 密钥的长度为 2048

签名

签名就是在这份资料后面增加一段强而有力的证明,以此证明这段信息的发布者和这段信息的有效性完整性。

简单来说,签名主要包含两个过程:摘要 和 非对称加密,首先对需要签名的数据做摘要(类似于常见的 MD5)后得到摘要结果。

然后通过签名者的私钥对摘要结果进行非对称加密即可得到签名结果

支付中签名的套路

来说下对接的支付中的签名,拿 支付宝 举例

生成签名

1. 生成参数并进行 url_encode 然后按照字典排序,组成字符串 等到待签名字符串。

2. 获取私钥 然后使用各自语音的加密方法 对待签名字符串进行加密

3. 得到签名 (sign) 后并进行 base64 转码

4. 把加密字符串的的数组 和 签名 一并发给接受方

验证签名

1. 在通知返回参数列表中,除去 签名参数 (sign ) 以及空的参数 其他的全部都是待签名的参数。

2. 将剩下参数进行 url_decode, 然后进行字典排序, 使用 & = 组成字符串,得到待签名字符串。

3. 将签名参数(sign)使用 base64 解码为字节码串。

4. 使用 RSA 的验签方法,通过签名字符串、签名参数(经过 base64 解码)及支付宝公钥验证签名,根据返回结果判定是否验签通过

PHP 中 OpenSSL 的使用

php 的扩展中有 OpenSSL 库 可以用来操作 对称/非对称的加密 算法

下面贴段大概的 PHP 示例代码

生成待 签名 / 验签 的字符串

/*** 生成待签名的字符串* @param $data 参与签名的参数数组* @return string 待签名的字符串*/
function getSignStr($data)
{//排序ksort($data);//剔除sign 如果对方的签名叫sign 或者可以在调用方法的时候剔除//unset($data['sign']);$stringToBeSigned = '';$i = 0;foreach ($data as $k => $v) {if ($i == 0) {$stringToBeSigned .= "$k" . "=" . "$v";} else {$stringToBeSigned .= "&" . "$k" . "=" . "$v";}$i++;}return $stringToBeSigned;
}
生成签名,返回签名字符串sign
/*** 生成签名* @param array $params 待签名的所有参数* @return string 生成的签名*/
function getSignGenerator($params)
{//生成待验签的字符串$data = $this->getSignStr($params);//私钥的内容 一行的格式$privateKey = 'xxx';$pem = "-----BEGIN RSA PRIVATE KEY-----\n" .wordwrap($privateKey, 64, "\n", true) ."\n-----END RSA PRIVATE KEY-----";//openssl_private_encrypt($data, $crypted, $pem);openssl_sign($data, $sign, $pem, OPENSSL_ALGO_SHA256);$sign = base64_encode($sign);return $sign;
}

验证签名


/*** 验证签名* @param array $params 待签名的所有参数* @param string $sign 生成的签名* @return boolean 校验的结果*/
function signCheck($params, $sign)
{//生成待验签的字符串$data = $this->getSignStr($params);//对方的公钥内容 一行的形式$publicKey = 'xxx';$pem = "-----BEGIN PUBLIC KEY-----\n" .wordwrap($publicKey, 64, "\n", true) ."\n-----END PUBLIC KEY-----";$checkResult = (bool)openssl_verify($data, base64_decode($sign), $pem, OPENSSL_ALGO_SHA256);return $checkResult;
}

自己的加密方法

/*** 我们自己的加密* @param $str 待加密的字段* @return string*/
function encrypt($string)
{//公钥内容 一行的形式$pubKey = 'xxxx';$res = "-----BEGIN PUBLIC KEY-----\n" .wordwrap($pubKey, 64, "\n", true) ."\n-----END PUBLIC KEY-----";openssl_public_encrypt($string, $encrypt, $res);return base64_encode($encrypt);
}

自己的解密方法

/*** 我们自己的解密* @param $secret 加密后的base64字段* @return string*/
function decrypt($secret)
{//私钥内容 一行的形式$privateKey = 'xx';$res = "-----BEGIN RSA PRIVATE KEY-----\n" .wordwrap($privateKey, 64, "\n", true) ."\n-----END RSA PRIVATE KEY-----";openssl_private_decrypt(base64_decode($secret), $oldData, $res);return $oldData;
}

注意:主要使用到下面几个函数 分别都是对应的

私钥加密 openssl_private_encrypt => 公钥解密 openssl_public_decrypt

公钥加密 openssl_public_encrypt => 私钥解密 openssl_private_decrypt

使用的时候分别使用对应的公钥 / 私钥的文件内容即可,我是把公钥和私钥都配置了一行形式 (也就是没有换行符等 方便配置吧)。

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

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

相关文章

GitHub的简单操作

引言 今天开始就要开始做项目了,上午是要把git搭好。搭的过程中遇到好多好多的问题。下面就说一下git的简单操作流程。我们是使用的GitHub,下面也就以这个为例了 一、GitHub账号的登录注册 https://github.com/ 通过这个网址可以来到GitHub首页 点击中间绿色的S…

【2025最新计算机毕业设计】基于Spring Boot+Vue影院购票系统(高质量源码,提供文档,免费部署到本地)

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

数据安全防护

数据安全防护有几个层面 边界安全 网络防火墙负责的部分 认证 kerberos负责的部分 授权 识别用户是否有访问某个模块的权限 认证是kerberos负责的事情 1. 客户端请求认证服务器,希望得到访问服务端票据的票据 2.客户端拿到访问服务端票据的票据后,去…

Cursor连接腾讯云Cloud Studio开发环境

文章目录 环境准备Cloud StudioCursor Cursor连接Cloud Studio开发环境 环境 腾讯云Cloud Studio语言模板All In One实例Windows 11Firefox 133.0.3 (64 位)Cursor 0.44.9 准备 Cloud Studio 在腾讯云Cloud Studio( https://ide.cloud.tencent.com/ &#xff09…

【工具整理】WIN换MAC机器使用工具整理

最近公司电脑升级,研发同学统一更换了 Mac Book Pro 笔记版电脑,整理一下安装了那些软件以及出处,分享记录下~ 知识库工具 1、语雀 网址:语雀,为每一个人提供优秀的文档和知识库工具 语雀 个人花园&…

面试题解,Java中的“对象”剖析

一、说一说JVM中对象的内存布局?new一个对象到底占多大内存? 话不多说,看下图,对象的内存布局图 一个对象的内存布局主要由三部分组成:对象头(Object Header)、实例数据(Instance D…

大白话拆解——多线程中关于死锁的一切(七)(已完结)

前言: 25年初,这个时候好多小伙伴都在备战期末 小编明天还有一科考试,日更一篇,今天这篇一定会对小白非常有用的!!! 因为我们会把案例到用代码实现的全过程思路呈现出来!&#xff…

家教老师预约平台小程序系统开发方案

家教老师预约平台小程序系统将连接学生/家长与家教老师,提供一站式的家教服务预约体验。 一、用户需求分析1、家教老师:希望获得更多的学生资源,通过平台展示自己的教学特长和经验,管理个人日程,接收并确认预约请求&a…

windows 图形基础架构简介

背景 本文尝试对Windows系统中的一些Graphic相关的概念进行介绍和厘清。 windows图形基础架构简介 Windows 为图形提供了多个 API,下图显示了这些 API。 上图出自微软官方https://learn.microsoft.com/en-us/windows/win32/learnwin32/overview-of-the-windows-…

QML使用Popup实现弹出Message

方案一:popup import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15ApplicationWindow {visible: truewidth: 640height: 480title: qsTr("Top Message Popup Example")ColumnLayout {anchors.centerIn: parentspacing: 10Butt…

Ⅱ.INTRODUCTION TO CUDA C

前言 上一节环境配置好了,我们开始吧! 一、A First Program 1. Hello, World! 我们先写一个C语言的 Hello, World! 作为对比 int main(void){printf("Hello, World!\n");return 0; }大家应该知道这个代码运行在CPU上吧,我们CP…

如何轻松关闭 iPhone 上的 HEIC [HEIC 图像技巧]

您是否正在为关闭 iPhone 上的 HEIC 而烦恼?你不是一个人; Apple 的首选图像文件格式仍可能存在一些兼容性问题。当您与某人共享照片或尝试在Windows计算机上打开图像时,就会出现此问题。幸运的是,Apple 使关闭 HEIC iPhone 变得更加容易。 …

Postgresql 命令还原数据库

因为PgAdmin打不开,但是数据库已经安装成功了,这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…

docker中使用Volume完成数据共享

情景概述 在一个docker中,部署两个MySQL容器,假如它们的数据都存储在自己容器内部的data目录中。这样的存储方式会有以下问题: 1.无法保证两个MySQL容器中的数据同步。 2.容器删除后,数据就会丢失。 基于以上问题,容…

vue——滑块验证

1. 介绍 1.1 简介 基于滑动式的验证码,免于字母验证码的繁琐输入 用于网页注册或者登录 1.2 来源说明 vue使用滑块验证功能,是基于vue-monoplasty-slide-verify这样的一个开源项目,进行实现的,这是这个开源项目的网址传送阵&#…

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能,选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其,在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换,特别方便。VS文件另…

Unity3D仿星露谷物语开发16之角色拾取道具

1、目标 当角色经过道具时会拾取道具放到库存列表中,此时道具消失并打印库存信息。 2、创建新的Enum 在Assets -> Scripts -> Enums -> Enum.cs中添加库存位置相关的信息。 public enum InventoryLocation {player, // 在角色手中chest, // 在箱子里co…

UE4_用户控件_3_用户控件输入数据的方法

祝愿大美兰陵越来越好! 一、效果展示: 二、先制作一个角色 1、新建个父类为pawn的蓝图类。更名为BP_Image_Character。 2、这个角色只是用于观察场景,并与场景中的物体相碰撞用的,所以不需要骨骼网格体, 3、但是我们…

文献阅读 | B. S. Carmo 2010

目录 一、文献名称二、原文地址三、ABSTRACT主要发现详细观察分岔分析雷诺数依赖性比较见解意义结论 四、IINTRODUCTION历史研究回顾计算研究近期研究进展研究空白与目的论文结构 一、文献名称 二、原文地址 研究目的:研究串列排列双圆柱体周围流场中的次级不稳定性…

vue3 css实现文字输出带光标显示,文字输出完毕,光标消失的效果

Vue实现过程如下&#xff1a; <template><div ><p ref"dom_element" class"typing" :class"{over_fill: record_input_over}"></p></div> </template> <script setup> import {onMounted, ref} from…