当前位置:   article > 正文

签名算法SHA256withRSA,RSA数字证书公钥私钥生成_sha256withrsa生成密钥

sha256withrsa生成密钥

"SHA256withRSA" 是一种签名算法,结合了 SHA-256 哈希算法和 RSA 加密算法。

RSA数字证书公钥密钥生成:

Linux系统下运行以下命令生成:

如果提示输出密码,可以为空,直接回车

生成的公钥rsa_public_key.pem和密钥rsa_private_key.pem文件在当前目录下

  1. # openssl
  2. # genrsa -out rsa_private_key.pem 2048 Generating RSA private key, 2048 bit long modulus
  3. # pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
  4. # rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

 签名算法sha256withrsa:

  1. $string:需要加密的字符串
  2. $binary_signature:加密后保存到该变量中
  3. $this->privateKey:RSA的私钥。(使用file_get_contents()读取私钥文件获取);
  4. openssl_sign($string, $binary_signature, $this->privateKey, OPENSSL_ALGO_SHA256);

实例:

签名算法使用sha256withrsa算法,我方和渠道伙伴需交换RSA数字证书公钥用于验证签名,签名时,使用RSA数字证书私钥对签名参数串进行签名,RSA密用2048位及以上的,将签名值使用BASE64转码后填充到报文的数字签名域(Signature)。验证签名时,使用对方颁发的RSA数字证书公钥进行验签

  1. /**
  2. * 签名 + post请求
  3. * @param array $param 请求参数
  4. * @param string $method 第三方方法名
  5. * @param string $api_method 接口名
  6. * @param string $is_big 通道别名
  7. * @param int $phone 手机号码
  8. * @return mixed
  9. */
  10. public function sign_post($param, $method, $api_method, $is_big, $phone)
  11. {
  12. $param['reqTime'] = date('YmdHis');
  13. $param['partnerId'] = $this->partnerId;
  14. $this->log($param, $api_method, $is_big, '签名前数据:', $phone);
  15. $signature = $this->makeSign($param);
  16. $this->log($signature, $api_method, $is_big, '签名值:');
  17. $param['signature'] = $signature;
  18. $types = explode('_',$api_method);
  19. if($types[0] == 'sk'){
  20. $requestUrl = $this->edUrl . $method;
  21. }else{
  22. $requestUrl = $this->zdUrl . $method;
  23. }
  24. $this->log($requestUrl, $api_method, $is_big, '请求url:');
  25. $this->log($param, $api_method, $is_big, '请求报文:');
  26. $res = $this->curl($requestUrl, $param);
  27. $this->log($res, $api_method, $is_big, '响应报文:');
  28. return $res;
  29. }
  30. /**
  31. * 生成签名
  32. * @param $params array 请求参数
  33. * @param $privateKey string 秘钥
  34. * @return $sign string 签名内容
  35. */
  36. public function makeSign($params)
  37. {
  38. //签名步骤一:按字典序排序参数,再把所有数组值以“&”字符连接起来
  39. ksort($params);
  40. $string = $this->toUrlParams($params);
  41. openssl_sign($string, $binary_signature, $this->privateKey, OPENSSL_ALGO_SHA256);
  42. $sign = base64_encode($binary_signature);
  43. return $sign;
  44. }
  45. /**
  46. * 格式化参数格式化成url参数
  47. * @param $params array
  48. */
  49. public function toUrlParams($params)
  50. {
  51. $buff = "";
  52. foreach ($params as $k => $v) {
  53. if ($v != "" && !is_array($v)) {
  54. $buff .= $k . "=" . $v . "&";
  55. }
  56. }
  57. $buff = trim($buff, "&");
  58. return $buff;
  59. }
  60. //接口post请求
  61. public function curl($url = '', $data = '')
  62. {
  63. $ch = curl_init();
  64. curl_setopt($ch, CURLOPT_URL, $url);
  65. if (!empty($data)) {
  66. curl_setopt($ch, CURLOPT_POST, 1);
  67. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  68. }
  69. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  70. curl_setopt($ch, CURLOPT_TIMEOUT, 30); //超时时间30秒
  71. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  72. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  73. $output = curl_exec($ch);
  74. curl_close($ch);
  75. return $output;
  76. }
  77. /**
  78. * 验签
  79. * @param $data array 需要验签的数据
  80. */
  81. public function verifySign($data, $publicKey)
  82. {
  83. if (empty($data) || empty($data['signature'])) {
  84. return false;
  85. }
  86. $sign = $data['signature'];
  87. unset($data['signature']);
  88. ksort($data);
  89. $string = $this->ToUrlParams($data);
  90. $pubKey = "-----BEGIN PUBLIC KEY-----\n" .
  91. wordwrap($publicKey, 64, "\n", true) .
  92. "\n-----END PUBLIC KEY-----";
  93. $result = (bool)openssl_verify($string, base64_decode($sign), $pubKey, OPENSSL_ALGO_SHA256);
  94. return $result;
  95. }
  96. /**
  97. * 日志记录
  98. * @param $data /内容
  99. * @param $method /方法名
  100. * @param $phone /手机号
  101. * @param string $is_big /通道别名
  102. * @param string $title /标题
  103. */
  104. public function Log($data, $method, $is_big, $title, $phone = '')
  105. {
  106. $str = is_array($data) ? json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $data;
  107. if (empty($phone)) {
  108. $content = '【' . date('Y-m-d H:i:s') . '】' . $title . $str . PHP_EOL;
  109. } else {
  110. $content = ' phone:' . $phone . '【' . date('Y-m-d H:i:s') . '】' . $title . $str . PHP_EOL;
  111. }
  112. $path = APPPATH . "../PAYLOG/$is_big/$method/";
  113. if (!is_dir($path)) { //判断目录是否存在 不存在就创建
  114. mkdir($path, 0777, true);
  115. }
  116. file_put_contents($path . date("Y-m-d") . '.txt', $content, FILE_APPEND);
  117. //换行分割
  118. file_put_contents($path . date("Y-m-d") . '.txt', '------------------------' . PHP_EOL, FILE_APPEND);
  119. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/308293?site
推荐阅读
相关标签
  

闽ICP备14008679号