php对接java现实加签验签的实例


Posted in PHP onNovember 25, 2016

我实现的方法,主要是把java生成的密钥转为php能识别的pem格式的密钥,其它的加签、验签采用调用openssl内置签名方法。

java生成的密钥主要是字符串;而pem格式密钥是以64位为一行,并且带有如下头和尾的文件格式,然后php再去取得相对应pem格式字符串。

pem格式密钥

-----BEGIN PUBLIC KEY-----
//64chars一行(多行)
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
//64chars一行(多行)
-----END RSA PRIVATE KEY-----

1.java密钥转为pem格式的php代码

/**
 * 将字符串格式公私钥格式化为pem格式公私钥
 * @param $secret_key
 * @param $type
 * @return string
 */
public static function format_secret_key($secret_key, $type){
  //64个英文字符后接换行符"\n",最后再接换行符"\n"
  $key = (wordwrap($secret_key, 64, "\n", true))."\n";
  //添加pem格式头和尾
  if ($type == 'pub') {
    $pem_key = "-----BEGIN PUBLIC KEY-----\n" . $key . "-----END PUBLIC KEY-----\n";
  }else if ($type == 'pri') {
    $pem_key = "-----BEGIN RSA PRIVATE KEY-----\n" . $key . "-----END RSA PRIVATE KEY-----\n";
  }else{
    echo('公私钥类型非法');
    exit();
  }
  return $pem_key;
}

2.加签

/**
 * RSA加签
 * @param $paramStr
 * @param $priKey
 * @return string
 */
public static function sign($paramStr, $priKey){
  $sign = '';
  //将字符串格式公私钥转为pem格式公私钥
  $priKeyPem = SignUtil::format_secret_key($priKey, 'pri');
  //转换为openssl密钥,必须是没有经过pkcs8转换的私钥
  $res = openssl_get_privatekey($priKeyPem);
  //调用openssl内置签名方法,生成签名$sign
  openssl_sign($paramStr, $sign, $res);
  //释放资源
  openssl_free_key($res);
  //base64编码签名
  $signBase64 = base64_encode($sign);
  //url编码签名
  $sign = urlencode($signBase64);
  return $sign;
}

3.验签

/**
 * RSA验签
 * @param $paramStr
 * @param $sign
 * @param $pubKey
 * @return bool
 */
public static function verify($paramStr, $sign, $pubKey) {
  //将字符串格式公私钥转为pem格式公私钥
  $pubKeyPem = SignUtil::format_secret_key($pubKey, 'pub');
  //转换为openssl密钥,必须是没有经过pkcs8转换的公钥
  $res = openssl_get_publickey($pubKeyPem);
  //url解码签名
  $signUrl = urldecode($sign);
  //base64解码签名
  $signBase64 = base64_decode($signUrl);
  //调用openssl内置方法验签,返回bool值
  $result = (bool)openssl_verify($paramStr, $signBase64, $res);
  //释放资源
  openssl_free_key($res);
  //返回资源是否成功
  return $result;
}

以上这篇php对接java现实加签验签的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php中函数的形参与实参的问题说明
Sep 01 PHP
PHP动态创建Web站点的方法
Aug 14 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
php把数组值转换成键的方法
Jul 13 PHP
smarty循环嵌套用法示例分析
Jul 19 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
php实现的XML操作(读取)封装类完整实例
Feb 23 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
Mar 15 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
PHP抽象类与接口的区别详解
Mar 21 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 PHP
laradock环境docker-compose操作详解
Jul 29 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 #PHP
php实现的网页版剪刀石头布游戏示例
Nov 25 #PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 25 #PHP
基于CI框架的微信网页授权库示例
Nov 25 #PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 #PHP
thinkphp整合微信支付代码分享
Nov 24 #PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 #PHP
You might like
长波有什么东西
2021/03/01 无线电
PHP生成便于打印的网页
2006/10/09 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
UpdatePanel和Jquery冲突的解决方法
2013/04/01 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
Vue实现日历小插件
2019/06/26 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
Python os模块介绍
2014/11/30 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
大学生四个方面的自我评价
2013/09/19 职场文书
品质主管岗位职责
2014/03/16 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
保护动物倡议书
2014/04/15 职场文书
个人总结格式范文
2015/03/09 职场文书
涨价通知
2015/04/23 职场文书
庆祝教师节主持词
2015/07/06 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android