php电子签名

原理

使用一对公钥和私钥,用私钥对数据进行签名,用公钥对签名数据进行加密,形成电子签名。

电子签名认证,用私钥解密数据,用公钥验证签名。

若加密容过长,则将加密内容按照固定长度分块,对每块进行加密再拼接;解密时也是分块进行,

分割大小固定。

生成证书

# 生成私钥openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048# 生成公钥openssl rsa -pubout -in private_key.pem -out public_key.pem

代码

目录结构

- public_private_key 证书
---- private_key.pem 私钥
---- public_key.pem 公钥- src
-- esign.php 电子签名类- vendor 扩展包-index.php 调用文件

电子签名类

namespace Wj/Esign;class esign {const RSA_ENCRYPT_BLOCK_SIZE = 117; //加密切割长度const RSA_DECRYPT_BLOCK_SIZE = 256; //解密切割长度private $privateKey; //私钥证书private $publicKey; //公钥证书private $signstr; //加密数据 字符串public function __construct($signdata) {$path = ROOT_PATH . "public_private_key" . DS . DS;$this->privateKey = openssl_get_privatekey(file_get_contents($path . "private_key.pem"));$this->publicKey = openssl_get_publickey(file_get_contents($path . "public_key.pem"));$this->setsigndata($signdata);}private function setsigndata($signdata) {$signstr = $signdata;if (is_array($signdata)) {$signstr = implode("", $signdata);}if (!is_string($signstr)) {if (empty($signstr)) {throw new \Exception("加密数据错误");}}$this->signstr = $signstr;}/*** 获取签名*/public function getsignstr() {openssl_sign($this->signstr, $signature, $this->privateKey);$signature = base64_encode($signature);$data = $this->encryptsign($signature);return $data;}/*** 加密签名*/private function encryptsign($signature) {if (!is_string($signature)) {return null;}$signature_arr = str_split($signature, self::RSA_ENCRYPT_BLOCK_SIZE);$useencrypted = "";foreach ($signature_arr as $key => $block) {openssl_public_encrypt($block, $encrypted, $this->publicKey, OPENSSL_PKCS1_OAEP_PADDING);$useencrypted .= $encrypted;}$useencrypted = base64_encode($useencrypted);return $useencrypted ? $useencrypted : null;}/*** 解密签名*/private function decryptsign($encrypted) {if (!is_string($encrypted)) {return null;}$result = '';$encrypted_arr = str_split(base64_decode($encrypted), self::RSA_DECRYPT_BLOCK_SIZE);foreach ($encrypted_arr as $block) {openssl_private_decrypt($block, $dataDecrypt, $this->privateKey, OPENSSL_PKCS1_OAEP_PADDING);$result .= $dataDecrypt;}return $result ? $result : null;}/*** 签名验证*/public function verifysign($encrypted) {$encodestr = $this->decryptsign($encrypted);$result = base64_decode((string) $encodestr);$result = openssl_verify($this->signstr, $result, $this->publicKey);return $result == 1 ? true : false;}
}

调用

define('DS', DIRECTORY_SEPARATOR);
defined('ROOT_PATH') or define('ROOT_PATH', __DIR__ . DS);require "./vendor/autoload.php";
use Wj\Esign\esign;$data = ['name' => 'test','time' => time(),
];
$es = new esign($data);
$encrypted = $es->getsignstr();
$result = $es->verifysign($encrypted);
var_dump($encrypted, $result);

输出结果

string(1024) "g5j76cEr/odqfH6H4kUYM6GwCoJYKNLyh61O10XDIbCwqo0p+kmPhyMGL4sFam8L/vpCxwabV7FHjhq5JYbgYCq19T4PqsJ2yO8xs/Lf3x3DWvImIAkBghYRLYtyri6JoK2CATQ7cGWKYl9s16LLvpxmmLlcWztnvRc47NkjEVinTNKGghNLcSU1pmphCyvI0nzYMCdrsTKGWVPt5qDXUtJsukLS8rMfxQNQQppRUeETUr+1+r8PAEqrJVRSeJIQ+Eng/JpolWB4cYnLjOPqknU8ft4zuHGwcGbtcvk/DGI2B+4uwC+Y71evWim+Jct6hFE7IOQNIuUyg/gpAcQH7z3Ab6gfdup0pM4gfM/rCsfvMhC07AngeraiE+5Yzl2mugzzYe5hHZ5epUPpur3K/v1ZP3Hf6thzmImvcj1b661FB3ElVSLbqHl9SvrYgd5LQOfl0ThsJe51dJqp+40hmeH7jyYrJAtykmDIu992lsfkc+eJQ1NcyNnseztQ7f0F0vj2sLNnpR26PvXznik2auQPMLdsr3ksPbJM9gcaCPLE0apfbU0dUvGwpVGgbPYpRgSpGQXtc5uAeJtk/Ia24KMj7kOVlXG//3T7UhkrxF8WSmlfFoRpJq5jnc+ANNfZzRcINs3VdsTHHtWsbLjgCNsiPHAz9bezqs2y2JsFQMgJ6U+2QMQRwnSlEEQMtC9NCQJeTe3YivEhhEsgfNKLdS0+O8Ml3qRnYYLC0zI63EL6PsN7S69WQwS839TdtdUiwvUy8SC2rfYrXwNQpttCxJ/LQJTznOZbnYdMqTp2C0XRCMn8Jz5GQY4c3ZpP48MZ3+kAjKgNF1U9cWw0zDwEYIkFBI0EHAAYTgrRXNlUfSCgkDnKlb813WKrz/+f2oUQKYzl+wI25T4EREuASv3xi5Q/INlasL3Nj0jzLxwsHkm4hvon4aG2uc1oeNviPOmCgArKCNwQ+R4R8mvS1wTNnckgEdkFV9G0V6SxJUixIiKZAxSeaAL7Ijng6PGhJsFp"
D:\workspace\php\test\esign\index2.php:15:
bool(true)

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

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

相关文章

鸿蒙Harmony-从零开始构建类似于安卓GreenDao的ORM数据库(三)

目录 一,插入单条数据 二,批量插入数据 三,根据条件删除数据 四,传入对象删除数据 五,删除整张表的数据 六,根据条件更新数据 前面两个章节数据库的创建以及数据库表的创建都已经完成了,下面我们再来看看数据库的增删改查如何构建。 一,插入单条数据 我们先来看一下官…

年度优质会议推荐:【西安石油大学主办|IEEE出版|往届均EI】第七届智能控制、测量与信号处理国际学术会议 (ICMSP 2025)

第七届智能控制、测量与信号处理国际学术会议 (ICMSP 2025) 2025 7th International Conference on Intelligent Control, Measurement and Signal Processing (ICMSP 2025) 2025年11月28-30日 中国北京 主办单位:西安石油大学 会议详情:请点击 亮…

isp 图像处理--DPC坏点矫正

一,Bayer pattern简要介绍我们平时所看到的彩色图像每个像素有三个分量组成,分别为红绿蓝。而目前广泛用到的成像传感器为CMOS传感器,其输出的数据格式为每个像素点只有一个颜色分量,一般称为Bayer Pattern数据,格式如…

Redis常见数据类型及应用场景

好的,我们来详细讲解 Redis 的数据结构及其应用场景。Redis 的强大之处不仅仅在于它支持简单的键值对,更在于它提供了丰富的数据结构,每种结构都针对特定类型的应用场景进行了优化。 核心数据结构与应用场景 Redis 主要支持以下五种核心数据结…

【后端数据库】MySQL 索引生效/失效规则 + 核心原理

SQL 优化的核心 —— 什么时候能“走索引”,什么时候会“失效”。整理一个索引生效/失效规则 核心原理的全景图,帮助彻底理解。🔑 MySQL 索引使用的核心原理MySQL 使用 BTree 索引(最常见),特点是&#xf…

基于 YOLOv11n 的无人机航拍小目标检测算法学习

基于 YOLOv11n 的无人机航拍小目标检测算法问题:无人机航拍图像中小目标检测面临尺度变化大导致的检测精度较低和推理速度较慢等 解决:在 C3k2 模块中引入可变形卷积(DCN),增强模型在复杂背景下对 多尺度目标的特征提取…

第06章:map():数据变形金刚,想变什么变什么

文章目录map()基础:一对一的数据转换map()的工作原理方法引用让代码更简洁对象转换:实际业务应用用户信息转换示例特殊类型的map():mapToInt、mapToLong、mapToDouble链式map():多重转换map()与filter()组合:数据处理管…

197-200CSS3响应式布局,BFC

CSS3响应式布局-媒体查询举例<title>01.媒体查询_媒体类型</title><style>h1 {width: 600px;height: 400px;background-image: linear-gradient(60deg,red,yellow,green);font-size: 40px;color: white;text-shadow: 0 0 20px black;text-align: center;line…

[Android] UI进阶笔记:从 Toolbar 到可折叠标题栏的完整实战

学习 Android 开发的过程中&#xff0c;UI 控件往往是最直观也最容易踩坑的部分。本文整理了我在学习《第一行代码》后的实践笔记&#xff0c;涵盖 Toolbar、自定义标题栏、菜单、Snackbar、CoordinatorLayout、可折叠标题栏、SwipeRefreshLayout 下拉刷新、FloatingActionButt…

计算机网络---http(超文本传输协议)

1. HTTP的定义与核心属性 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是万维网&#xff08;WWW&#xff09;的核心通信协议&#xff0c;定义了客户端&#xff08;如浏览器、APP&#xff09;与服务器之间如何传输“超文本”&#xff08…

【qml-7】qml与c++交互(自动补全提示)

背景&#xff1a; 【qml-5】qml与c交互&#xff08;类型单例&#xff09; 之前记录过qml与c交互的方式&#xff0c;目前为止我使用的是“类型单例”方式。这些名字是我自己起的&#xff0c;只为说明问题&#xff0c;严谨的还是以手册为准。 “类型单例”方式时提到过自动补全…

网页提示UI操作-适应提示,警告,信息——仙盟创梦IDE

代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原生动态提示框</title><style>…

第八篇 永磁同步电机控制-MTPA、MTPV

永磁同步电机控制系列课程&#xff1a; 第一篇 永磁同步电机控制-认识电机 第二篇 永磁同步电机控制-电机的分类 第三篇 永磁同步电机控制-硬件基础知识 第四篇 永磁同步电机控制-软件基础知识 第五篇 永磁同步电机控制-数学模型 第六篇 永磁同步电机控制-控制方法 第七…

JAVA:Spring Boot 集成 Temporal 实现订单处理系统

🛠 1、简述 在现代分布式系统中,订单处理涉及多步骤工作流(如库存扣减、支付确认、物流派单等)。为了确保这些步骤的 可靠性、可观测性 和 容错性,我们可以使用 Temporal 实现工作流管理。 本文将介绍如何在 Spring Boot 中集成 Temporal,并通过一个订单处理的实际案例…

服务器硬件电路设计之 SPI 问答(六):如何提升服务器硬件电路中的性能?如何强化稳定性?

在服务器 SPI 硬件设计中&#xff0c;通信性能&#xff08;如传输速率、数据吞吐量&#xff09;与稳定性&#xff08;抗干扰、误码率&#xff09;直接决定外设响应效率&#xff0c;需从硬件设计、参数配置、干扰抑制三方面系统优化。一、性能优化核心策略&#xff1a;根据 SPI …

Web 聊天室消息加解密方案详解

目录 ​编辑 一、Web 聊天室消息加解密需求与技术约束 1.1 核心安全需求 1.2 技术约束 二、主流消息加解密方案详解 2.1 方案 1&#xff1a;对称加密&#xff08;AES-256-GCM&#xff09; 2.1.1 方案概述 2.1.2 核心原理 2.1.3 实现步骤&#xff08;分场景&#xff09…

组合导航 | RTK、IMU与激光雷达组合导航算法:原理、实现与验证

RTK、IMU与激光雷达组合导航算法:原理、实现与验证 文章目录 RTK、IMU与激光雷达组合导航算法:原理、实现与验证 一、组合导航系统原理与数学模型 1.1 传感器特性与互补性分析 1.2 系统状态方程构建 1.3 多源观测方程设计 (1)RTK观测模型 (2)激光雷达观测模型 (3)多源观…

使用Cadence工具完成数模混合设计流程简介

众所周知&#xff0c;Cadence的Virtuoso是模拟设计领域的核心工具&#xff0c;市占率达到75%&#xff0c;随着近些年来Cadence在数字版图设计&#xff08;APR&#xff09;领域的崛起&#xff0c;invs&#xff0c;PVS等一众工具也都成了很多公司的首选后端流程工具。依照强强联合…

FunASR人工智能语音转写服务本地部署测试

前提条件&#xff1a;本机&#xff1a;windows11 &#xff0c;已安装docker1.下载镜像使用命令下载docker镜像docker pull registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.13下载完成后&#xff0c;建立文件夹储存之后需要下载的模型…

Python OpenCV图像处理与深度学习

Python OpenCV图像处理与深度学习 1. Python OpenCV入门&#xff1a;图像处理基础 2. Python OpenCV开发环境搭建与入门 3. Python OpenCV图像处理基础 4. Python OpenCV视频处理入门 5. Python OpenCV图像几何变换入门 6. Python OpenCV图像滤波入门 7. Python OpenCV边缘检测…