weiliwei 发表于 2017-12-29 23:33:18

php生成md5签名原理

<?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]
查看完整版本: php生成md5签名原理