php使用openssl进行数字签名验证

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: hanks
 5  * Date: 6/2/2017
 6  * Time: 6:03 PM
 7  */
 8 /*
 9 【数字签名】
10 使用完全加密的数据进行传输的好处是更加安全,但是计算更加复杂,需要传输的数据也更多,
11 更常用的方式只是对要传输的数据做一个数字签名,在接收端对接收到的数据进行一个签名运算,
12 只要客户端计算的签名和接受的的签名一样就可以认为收到的数据没有被篡改过。
13
14 计算签名使用openssl提供的openssl_sign(),签名验证使用openssl_verify()
15 这两个函数的函数签名为:
16
17 bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
18 int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
19 通过参数比较容易理解函数的使用,sign函数第一个函数是一个字符串,所以对数组,
20 对象等签名需要使用json_encode或者base64_encode等函数编码一下;
21 第二个参数是&$signature就是函数会把对数据$data的签名保存在$signature变量。
22
23 注意返回值,第一个函数是bool值,第二个是int,1表示签名验证通过, 0表示签名不正确,-1表示发生错误。*/
24
25 $publicKey = file_get_contents(‘./php-public.key‘);
26 $privateKey = file_get_contents(‘./php-private.key‘);
27
28 $data = [
29     ‘orderId‘ => 100002,
30     ‘pay_time‘ => ‘2015-09-02 10:10:10‘,
31     ‘extra‘=>‘额外的数据‘
32 ];
33 $signature = ‘‘;
34 openssl_sign(json_encode($data), $signature, $privateKey);
35 echo ‘sign is: ‘ . base64_encode($signature);
36
37 //这里做实验,手动的篡改下orderId的键值
38 //$data = [
39 //    ‘orderId‘ => 100003,
40 //    ‘pay_time‘ => ‘2015-09-02 10:10:10‘,
41 //    ‘extra‘=>‘额外的数据‘
42 //];
43
44 $verify = openssl_verify(json_encode($data), $signature, $publicKey);
45
46 echo "\nverify result: $verify";//返回的将是0,即签名不正确,返回1,表示签名验证通过
时间: 2024-11-05 02:39:46

php使用openssl进行数字签名验证的相关文章

C语言实现的SM2数字签名验证

最近在工作中遇到一个需求:签名者使用密码设备(如加密机)生成了一些 SM2 签名,现在用户需要对签名进行验证,可是验签方没有密码设备,验签必须使用软件实现.在 CSDN 上找到了 goldboar 写的 SM2 签名及验签函数( http://download.csdn.net/detail/goldboar/3833072),但是不能直接使用.原因如下: 1) goldboar 的程序是自己生成 SM2 密钥对,用密钥对产生签名再验证签名,而现在需要使用外部传入的公钥.签名来做验签: 2) g

使用OpenSSL做RSA签名验证 支付宝移动快捷支付 的server异步通知

因为业务须要.我们须要使用支付宝移动快捷支付做收款.支付宝给了我们<移动快捷支付应用集成接入包支付接口>见支付宝包<WS_SECURE_PAY_SDK>. 支付宝给的serverdemo仅仅有Java.C#.PHP三种,而我们server端使用的是C++. 这当中就涉及到接收支付宝的server异步通知.为了确保接收到的server异步通知来至支付宝,我们就必须验证支付宝的签名. 坑爹的是,原来PC端使用MD5做签名,预计支付宝考虑到移动端的风险更高,于是改用RSA做移动快捷支付应

使用OpenSSL做RSA签名验证 支付宝移动快捷支付 的服务器异步通知

由于业务需要,我们需要使用支付宝移动快捷支付做收款.支付宝给了我们<移动快捷支付应用集成接入包支付接口>见支付宝包<WS_SECURE_PAY_SDK>. 支付宝给的服务器demo只有Java.C#.PHP三种,而我们服务器端使用的是C++.这其中就涉及到接收支付宝的服务器异步通知.为了确保接收到的服务器异步通知来至支付宝,我们就必须验证支付宝的签名.坑爹的是,原来PC端使用MD5做签名,估计支付宝考虑到移动端的风险更高,于是改用RSA做移动快捷支付应用的签名.这无疑增加了我们迁移

openssl 摘要和签名验证指令dgst使用详解

1.信息摘要和数字签名概述 信息摘要:对数据进行处理,得到一段固定长度的结果,其特点输入: 1.输出长度固定.即输出长度和输入长度无关. 2.不可逆.即由输出数据理论上不能推导出输入数据 4.对输入数据敏感.当输入数据变化极小时,输出数据也会发生明显的变化 5.防碰撞.即不同的数据数据得到相同输出数据的可能性极低. 由于信息摘要有上述特点,一般保证数据的完整性,对一个大文件进行摘要运算,得到其摘要值.通过网络或者其他渠道传输后,通过验证其摘要值,确定大文件本身有没有发生变化. 数字签名:数字签名

win7 64位数字签名验证失败问题解决

今天重装一个win7 64位电脑,安装驱动后连接板子,设备管理器显示黄叹号,双击看状态提示"无法验证签名",错误码52.想了想先搞个方法通过一下,后面再说吧.结果用开机选择F8放手太麻烦,不能每次都盯着吧,网上看说用bcdedit配置也是个坑,天下文章一大抄,不但超错了方法还不管用.再想好像要装一个补丁,搜了一下,记起来了,是KB3033929.补丁下载链接如下:https://www.microsoft.com/en-us/download/details.aspx?id=46148

用Keytool和OpenSSL生成和签发数字证书

一)keytool生成私钥文件(.key)和签名请求文件(.csr),openssl签发数字证书      J2SDK在目录%JAVA_HOME%/bin提供了密钥库管理工具Keytool,用于管理密钥.证书和证书链.Keytool工具的命令在JavaSE6中已经改变,不过以前的命令仍然支持.Keytool也可以用来管理对称加密算法中的密钥. 最简单的命令是生成一个自签名的证书,并把它放到指定的keystore文件中: keytool -genkey -alias tomcat -keyalg

openssl req(生成证书请求和自建CA)

伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA.由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉openssl req和证书请求相关知识,可直接跳至后文查看openssl req选项整理,若不熟悉,建议从前向后一步一步阅读. 首先说明下生成证书请求需要什么:申请者需要将自己的信息及其公钥放入证书请求中.但在实际操作过程中,所需要提供的是私钥而非公钥,因为它会自动从私钥中提取公钥.另外,还需要将提供的数据进

10.openssl证书和CA功能概述

10.1 证书和CA功能概述 10.1.1 证书存在价值 数字证书正是为了建立实体跟密钥对之间的联系而存在,证书验证中心CA充当了确认特定实体跟密钥对之间关系的确认人,并且通过用自己的私钥对这些确认信息和公钥一起签名来保证其可信性和不可改变性. 10.1.2 证书生命周期 a.证书申请:所谓证书生命周期是指从证书申请到证书被吊销的整个过程,这中间涉及证书申请.颁发.使用管理方面的问题. b.证书颁发 c.证书验证 d.证书吊销:一是从CA的证书数据库中删除被吊销的证书:而是对外公布被撤销的证书信

基于CentOS 6.5 &nbsp; 加密、解密、openssl的基本应用及CA的实现过程

一.加密和解密 1.加密方式有:对称加密.单向加密.公钥加密 对称加密: 工具:gpg openssl enc 加密:openssl enc -des3 -a -salt -in /ets/fstab -out /tmp/fstab.cipher 解密:openssl enc -d -dec3 -a -salt -in /tmp/fstab.cipher  -out 文件 单向加密: 工具:sha1sum,md5sum,openssl dgst openssl dgst [-md5|-md4|-