设为首页 收藏本站
查看: 1391|回复: 0

[经验分享] php生成md5签名原理

[复制链接]

尚未签到

发表于 2017-12-29 23:33:18 | 显示全部楼层 |阅读模式
<?php  
/**
  * 资料来源:支付宝
  * 签名:所有交互的数据都需要签名,除了 sign(签名),和 sign_type(签名方式:md5,rsa)
  * md5签名
  * 1.私钥:只有你和服务器知道,用于加密数据,由英文字母和数据组成,共32位
  * 2.请求时签名:$sign=md5((待签名字符串.md5私钥));
  * 3.返回时验证:$_POST['sign']==md5((待验证字符串,md5私钥))
  * rsa签名
  * 1.私钥与公钥:openssl生成
  * 2.请求时签名:$sign = rsaSign(待签名字符串,私钥);
  * 3.返回时验证:$_POST['sign'] == rsaVerify(待验证字符串,公钥);
  */
  

  
/**
  * 演示md5签名过程
  */
  

  
/**
  * 除去数组中的空值和签名参数
  * @param $para 签名参数组
  * return 去掉空值与签名参数后的新签名参数组
  */
  
function paraFilter($para) {
  $para_filter = array();
  while (list ($key, $val) = each ($para)) {
  if($key == "sign" || $key == "sign_type" || $val == "")continue;
  else$para_filter[$key] = $para[$key];
  }
  return $para_filter;
  
}
  
/**
  * 对数组排序
  * @param $para 排序前的数组
  * return 排序后的数组
  */
  
function argSort($para) {
  ksort($para);
  reset($para);
  return $para;
  
}
  
/**
  * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  * @param $para 需要拼接的数组
  * return 拼接完成以后的字符串
  */
  
function createLinkstring($para) {
  $arg  = "";
  while (list ($key, $val) = each ($para)) {
  $arg.=$key."=".$val."&";
  }
  //去掉最后一个&字符
  $arg = substr($arg,0,count($arg)-2);
  //如果存在转义字符,那么去掉转义
  if(get_magic_quotes_gpc()){
  $arg = stripslashes($arg);
  }
  return $arg;
  
}
  
/**
  * 生成md5签名字符串
  * @param $prestr 需要签名的字符串
  * @param $key 私钥
  * return 签名结果
  */
  
function md5Sign($prestr, $key) {
  $prestr = $prestr . $key;
  return md5($prestr);
  
}
  

  
class Submit{
  public $_sign_type ='';
  public $_md5_key = '';
  public $_private_key_path = '';
  

  public function __construct($sign_type){
  $this->_sign_type = strtoupper($sign_type);
  }
  /**
  * 对参数进行过滤,然后排序
  * @param array $para_temp
  */
  function filterPara($para_temp){
  $para_filter = paraFilter($para_temp);//除去待签名参数数组中的空值和签名参数
  return argSort($para_filter);//对待签名参数数组排序
  }
  /**
  * 生成签名结果
  * @param $para_sort 已排序要签名的数组
  * @return string 签名结果字符串
  */
  function buildRequestMysign($para_sort) {
  //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  $prestr = createLinkstring($para_sort);
  $mysign = "";
  switch ($this->_sign_type) {
  case "MD5":$mysign = md5Sign($prestr, $this->_md5_key);break;
  case "RSA" :$mysign = rsaSign($prestr, $this->_private_key_path);break;
  default :$mysign = "";
  }
  return $mysign;
  }
  /**
  * 生成要发送给支付宝的参数数组
  * @param $para_temp 请求前的参数数组
  * @return 要请求的参数数组
  */
  public function buildRequestPara($para_temp) {
  $para_sort = $this->filterPara($para_temp);//对待签名参数进行过滤
  $para_sort['sign'] = $this->buildRequestMysign($para_sort);//生成签名结果,并与签名方式加入请求提交参数组中
  $para_sort['sign_type'] = strtoupper(trim($this->_sign_type));
  return $para_sort;
  }
  
}
  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429528-1-1.html 上篇帖子: linux下安装php的swoole扩展模块(安装后php加载不出来?) 下篇帖子: Linux 系统安装配置PHP服务(源码安装)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表