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 相关文章推荐
PHP4之COOKIE支持详解
Oct 09 PHP
最令PHP初学者们头痛的十四个问题
Jan 15 PHP
php 移除数组重复元素的一点说明
Nov 27 PHP
一步一步学习PHP(3) php 函数
Feb 15 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
Jul 13 PHP
新手学习PHP的一些基础知识分享
Jul 27 PHP
简单的cookie计数器实现源码
Jun 07 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
解决php扩展安装不生效问题
Oct 25 PHP
php实现图片压缩处理
Sep 09 PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 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
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python多线程学习资料
2012/12/19 Python
Python中文件操作简明介绍
2015/04/13 Python
python实现按任意键继续执行程序
2016/12/30 Python
python实现树形打印目录结构
2018/03/29 Python
Python单元和文档测试实例详解
2019/04/11 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
回门宴新郎答谢词
2014/01/12 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
入队仪式主持词
2015/07/04 职场文书
中学总务处工作总结
2015/08/12 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python
Go 语言结构实例分析
2021/07/04 Golang