SignUtil.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace LdzfPay\Api\Common;
  3. use LdzfPay\Api\Common\Logger;
  4. use LdzfPay\UmfPayService\UmfService;
  5. use think\Config;
  6. /**
  7. * 数据签名,验签处理工具类
  8. */
  9. Class SignUtil{
  10. /**
  11. * @param $plain string 签名明文串
  12. * @param $priv_key_file string 私钥地址
  13. * @return bool|string 签名base64编码后的字符串
  14. */
  15. public static function sign($plain, $priv_key_file){
  16. // $log = new Logger();
  17. try{
  18. // $log->logInfo("[UMF SDK]私钥文件绝对路径 ".$priv_key_file);
  19. if(!file_exists($priv_key_file)){
  20. // $log->logInfo("[UMF SDK]传入的私钥文件不存在,私钥文件绝对路径 ".$priv_key_file);
  21. die("[UMF SDK]传入的私钥文件不存在,私钥文件绝对路径 ".$priv_key_file);
  22. }
  23. $fp = fopen($priv_key_file,"rb");
  24. $priv_key = fread($fp, 8192);
  25. @fclose($fp);
  26. $pkeyid = openssl_get_privatekey($priv_key);
  27. if(!is_resource($pkeyid)){ return FALSE;}
  28. // compute signature
  29. @openssl_sign($plain, $signature, $pkeyid);
  30. // free the key from memory
  31. @openssl_free_key($pkeyid);
  32. // $log->logInfo("[UMF SDK]签名前明文 " .$plain);
  33. // $log->logInfo("[UMF SDK]签名后密文 " .base64_encode($signature));
  34. return base64_encode($signature);
  35. }catch(Exception $e){
  36. die("[UMF SDK]签名失败".$e->getMessage());
  37. }
  38. }
  39. /**
  40. * @param $plain string 签名明文串
  41. * @param $priv_key_file string 私钥地址
  42. * @return bool|string 签名base64编码后的字符串
  43. */
  44. public static function sign256($plain, $priv_key_file){
  45. $log = new Logger();
  46. try{
  47. $log->logInfo("[UMF SDK]私钥文件绝对路径 ".$priv_key_file);
  48. if(!file_exists($priv_key_file)){
  49. $log->logInfo("[UMF SDK]传入的私钥文件不存在,私钥文件绝对路径 ".$priv_key_file);
  50. die("[UMF SDK]传入的私钥文件不存在,私钥文件绝对路径 ".$priv_key_file);
  51. }
  52. $fp = fopen($priv_key_file,"rb");
  53. $priv_key = fread($fp, 8192);
  54. @fclose($fp);
  55. $pkeyid = openssl_get_privatekey($priv_key);
  56. if(!is_resource($pkeyid)){ return FALSE;}
  57. // compute signature
  58. @openssl_sign($plain, $signature, $pkeyid, OPENSSL_ALGO_SHA256);
  59. // free the key from memory
  60. @openssl_free_key($pkeyid);
  61. //$log->logInfo("[UMF SDK]签名前明文 " .$plain);
  62. $log->logInfo("[UMF SDK]签名后密文 " .base64_encode($signature));
  63. return base64_encode($signature);
  64. }catch(Exception $e){
  65. die("[UMF SDK]签名失败".$e->getMessage());
  66. }
  67. }
  68. /**
  69. * @param $plain string 验签明文
  70. * @param $signature string 验签密文
  71. * @return bool 验签结果
  72. */
  73. public static function verify($plain,$signature){
  74. //$cert_file = UmfService::$publicKeyPath;
  75. // $log = new Logger();
  76. // //$log->logInfo("[UMF SDK]公钥文件绝对路径 ".$cert_file);
  77. // //if(!file_exists($cert_file)){
  78. // // $log->logInfo("[UMF SDK]传入的公钥文件不存在,公钥文件绝对路径 ".$cert_file);
  79. // // die("[UMF SDK]传入的公钥文件不存在,公钥文件绝对路径 ".$cert_file);
  80. // //}
  81. //
  82. // $log->logInfo("[UMF SDK]异步通知验签明文 ".$plain);
  83. // $log->logInfo("[UMF SDK]异步通知验签密文 ".$signature);
  84. $signature = base64_decode($signature);
  85. $cert_file = Config::get('ldys_pay')['public_file'];
  86. $fp = fopen($cert_file, "r");
  87. $cert = fread($fp, 8192);
  88. fclose($fp);
  89. $pubkeyid = openssl_get_publickey($cert);
  90. if (!is_resource($pubkeyid)) {
  91. return FALSE;
  92. }
  93. $ok = openssl_verify($plain, $signature, $pubkeyid);
  94. @openssl_free_key($pubkeyid);
  95. if ($ok == 1) {
  96. // $log->logInfo("[UMF SDK]验签成功");
  97. return true;
  98. } elseif ($ok == 0) {
  99. // $log->logInfo("[UMF SDK]验签失败");
  100. return false;
  101. } else {
  102. // $log->logInfo("[UMF SDK]验签失败");
  103. return false;
  104. }
  105. }
  106. public static function verify256($plain,$signature){
  107. $log = new Logger();
  108. $signature = base64_decode($signature);
  109. $cert_file = Config::get('ldys_pay')['public_file'];
  110. $fp = fopen($cert_file,"r");
  111. $cert = fread($fp, 8192);
  112. fclose($fp);
  113. $pubkeyid = openssl_get_publickey($cert);
  114. if(!is_resource($pubkeyid)){return FALSE;}
  115. $ok = openssl_verify($plain,$signature,$pubkeyid,OPENSSL_ALGO_SHA256);
  116. @openssl_free_key($pubkeyid);
  117. if ($ok == 1) {
  118. $log->logInfo("[UMF SDK]验签成功");
  119. return true;
  120. } elseif ($ok == 0) {
  121. $log->logInfo("[UMF SDK]验签失败");
  122. return false;
  123. } else {
  124. $log->logInfo("[UMF SDK]验签失败");
  125. return false;
  126. }
  127. }
  128. }