为了防止在支付通信过程中的参数数据被篡改或者伪造,采用RSA进行数据签名和验证签名。

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

生成公私钥:

生成 RSA 私钥 PEM 文件:

openssl genrsa -out rsa_private_key.pem 2048

根据已经生成的私钥再生成公钥:

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

注意:生成后的rsa_private_key.pem私钥不能直接用于java进行加密,原因是java使用的PKCS#8格式的私钥,但PHP不会有问题。java的keytool生成的rsa公钥密私钥是16进制字符串,php用openssl生成的公钥私钥是基于base64格式的字符串或者二进制格式,这两种不同的公约密钥并不能直接转化。

签名验证:

首先URL的参数请用'key'的字母顺序排序,然后对整个URL,除了sign签名参数之外的部分做签名,以参数名sign做urlencode处理后加在URL后面。比如如下红色的部分为签名的原始字符串数据,蓝色部分为追加的签名值。

changba://game/goldpay?access_token=xxxxxxxx&id=yourgameid&orderid=111111&ordesc=%E8%B4%AD%E4%B9%B0%E4%B8%80%E4%B8%AAXX%E6%B8%B8%E6%88%8FXX%E6%AD%A6%E5%99%A8&payredirect_uri=game%3a%2f%2fchangba%2fpay&price=100&ver=1.0&sign=o8z82NNFYggbYC/kcPztSrXtTVa39A7eqyxhcNtvXRteHl8nvcNFmhrjk9lhz0Td877m4xUGb6LnEcs4acoeQnUtub6Yn1Y9sLtbQ1kBTTbD9oV2Ru0Gu4HutA/iJZWtFrzcvUo/JsZOCT4Vn9XtLGWFgvaPCpDqUF49/HBvJIVr/jMk2Ww2FuZgieIH8qBVHxTAoLdJfD2kwEMIPo9y/i3qbnluAmPC0vvuUZPaFohVn0M9BXps83c7750JaMJuFRarpC/Xp6gUjOm5neSbcwWBe7kHPWPIOjLTmQSWUlsf/Mu/Bhd/neHwzoUwqJbOotGRIFC6pfXiQhc6oidAxQ==

注意签名的字符串数据中参数值必须是urlencode处理过的,签名值需要再做base64编码以及urlencode处理,以备当做sign URL参数传递。

验签的时候需要先进行base64解码,然后才进行验证签名。

class ChangbaRsaSign {

    /**RSA签名函数

     * $data为待签名数据,比如URL

     * 签名用游戏方的保密私钥,必须是没有经过pkcs8转换的.结果需要用base64编码以备在URL中传输

     * return Sign 签名

     */

    public static function sign($data) {

        $priKey = file_get_contents('key/rsa_private_key.pem');

        //转换为openssl密钥,必须是没有经过pkcs8转换的私钥

        $res = openssl_get_privatekey($priKey);

        //调用openssl内置签名方法,生成签名$sign

        openssl_sign($data, $sign, $res);

        openssl_free_key($res);

        $sign = base64_encode($sign);

        return $sign;

    }

    /**RSA验证签名

     * $data为要验证的数据字符串

     * $sign是需要验证的签名数据,是直接从URL中取到的$_POST["sign"]型参数,函数里面会进行base64_decode的。

     * return 验签是否通过,为BOOL值

     */

    public static function verify($data, $sign)  {

        //读取公钥文件,也就是签名方公开的公钥,用来验证这个data是否真的是签名方发出的

        $pubKey = file_get_contents('key/rsa_public_key.pem');

        $res = openssl_get_publickey($pubKey);

        //调用openssl内置方法验签,返回bool值

        $result = (bool)openssl_verify($data, base64_decode($sign), $res);

        openssl_free_key($res);

        return $result;

    }

PHP RSA参数签名的更多相关文章

  1. 分享一款一直在维护的【网络开发运维|通用调试工具】: http请求, websocket,cmd, RSA,DES, 参数签名工具,脚本批量生成工具,google动态口令,端口检测,组件注册,js混淆...

    首先发下下载地址:https://files.cnblogs.com/files/taohuadaozhu/ConfigLab.Test.ex.rar 日常开发,运维,跨部门跨公司对接中.  想快速调 ...

  2. RSA后台签名前台验签的应用(前台采用jsrsasign库)

    写在前面 安全测试需要, 为防止后台响应数据返给前台过程中被篡改前台再拿被篡改后的数据进行接下来的操作影响正常业务, 决定采用RSA对响应数据进行签名和验签, 于是有了这篇<RSA后台签名前台验 ...

  3. [置顶] webapi token、参数签名是如何生成的

    一个问题 在这里我想问大家一句,如果你向一个刚刚接触.net web后端程序开发的同学(别人刚刚也就学了webform的request,response,会提交表单的这种刚接触不久的同学),你怎么去解 ...

  4. 防盗链之URL参数签名

    一.概述 传统的 IP 禁用.referer 防盗链.User-Agent 防盗链.地区访问控制等防盗链措施已经无法完全满足用户要求,所以开发出URL参数签名方式来防盗链 二.实现 Token防盗链是 ...

  5. C# 参数签名字符串按 ASCII码排序,注意其中的坑

    参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...

  6. 参数签名ascii码排序的坑

    参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...

  7. 【转】js生成接口请求参数签名加密

    js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...

  8. 防盗链之URL参数签名 总结

    一.概述 传统的 IP 禁用.referer 防盗链.User-Agent 防盗链.地区访问控制等防盗链措施已经无法完全满足用户要求,所以开发出URL参数签名方式来防盗链 二.实现 Token防盗链是 ...

  9. webapi token、参数签名是如何生成的(转载)

    API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间 在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请 ...

随机推荐

  1. unity小地图技术方案总结

    技术方案 一:从顶视图获取实时小地图(优点实现快容易对地图进行放大缩小操作而且地图,缺点是不好对地图做出修改,只能在顶部加个另外的相机层来遮盖) 1.创建Redertexture并改名为smallma ...

  2. yii2 可逆加密

    加密: $data 是你要加密的内容, $secretKey 是你自己设置的salt, $encryptedData = Yii::$app->getSecurity()->encrypt ...

  3. ruby 基础知识三 读写文件

    1.File 中参数的含义 r 只读模式.文件指针被放置在文件的开头.这是默认模式. r+ 读写模式.文件指针被放置在文件的开头. w 只写模式.如果文件存在,则重写文件.如果文件不存在,则创建一个新 ...

  4. [译]flexbox全揭秘

    原文:http://css-tricks.com/snippets/css/a-guide-to-flexbox/ 弹性布局(弹性盒子,现今仍是w3c的候选推荐),目标在于,对于一个容器中的各个项目块 ...

  5. python标准模块(time、datetime及hashlib模块)

    一.time,datetime模块 时间相关的操作 import time time.sleep(5) # ==> 停顿多少秒 print(time.time()) # ==> 返回时间戳 ...

  6. android App使用新浪微博sdk的使用总结

    问题1:注册app的key 问题2:在微博开放平台,我的应用中心中,设置应用的基本信息的时候其中有一项,是设置你的应用的签名,签名是需要在安卓设备上安装一个生成签名的app(这个app界面很丑,这点我 ...

  7. SQL Server中查询数据库及表的信息语句

    /* -- 本文件主要是汇总了 Microsoft SQL Server 中有关数据库与表的相关信息查询语句. -- 下面的查询语句中一般给出两种查询方法, -- A方法访问系统表,适应于SQL 20 ...

  8. 释放修改OS X 10.11系统文件权限【转】

    序言:有时要替换相关的(系统目录下的)文件以完成软件的破解,但在 OS X 10.11 系统图形界面下,Root(系统超级用户)已‘转变’为 Administrator(管理员用户),选择系统文件夹( ...

  9. 轻松搞定laravel的curd操作搞定简易留言版(四)

    一:目的开发laravel简易留言板 二:路由操作routes.php <?php //GET /msg/index 展示留言列表 //GET /msg/add 展示表单 //POST /msg ...

  10. ASP.NET运作流程

    当我们在浏览器输入域名访问服务器资源时,会向服务器发送Http请求,并经由IIS处理后,交由ASP.NET托管程序处理,进入ASP.NET管道.在IIS内部如何处理我们不需要深入去了解,在ASP.NE ...