签名算法sha256withrsa,RSA数字证书公钥私钥生成,base64转码和文件日志
生活随笔
收集整理的這篇文章主要介紹了
签名算法sha256withrsa,RSA数字证书公钥私钥生成,base64转码和文件日志
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
RSA數字證書公鑰密鑰生成:
在Linux系統下運行以下命令生成:
如果提示輸出密碼,可以為空,直接回車
生成的公鑰rsa_public_key.pem和密鑰rsa_private_key.pem文件在當前目錄下
# openssl# genrsa -out rsa_private_key.pem 2048 Generating RSA private key, 2048 bit long modulus# pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt# rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem?簽名算法sha256withrsa:
$string:需要加密的字符串 $binary_signature:加密后保存到該變量中 $this->privateKey:RSA的私鑰。(使用file_get_contents()讀取私鑰文件獲取);openssl_sign($string, $binary_signature, $this->privateKey, OPENSSL_ALGO_SHA256);實例:
簽名算法使用sha256withrsa算法,我方和渠道伙伴需交換RSA數字證書公鑰用于驗證簽名,簽名時,使用RSA數字證書私鑰對簽名參數串進行簽名,RSA密用2048位及以上的,將簽名值使用BASE64轉碼后填充到報文的數字簽名域(Signature)。驗證簽名時,使用對方頒發的RSA數字證書公鑰進行驗簽
/*** 簽名 + post請求* @param array $param 請求參數* @param string $method 第三方方法名* @param string $api_method 接口名* @param string $is_big 通道別名* @param int $phone 手機號碼* @return mixed*/public function sign_post($param, $method, $api_method, $is_big, $phone){$param['reqTime'] = date('YmdHis');$param['partnerId'] = $this->partnerId;$this->log($param, $api_method, $is_big, '簽名前數據:', $phone);$signature = $this->makeSign($param);$this->log($signature, $api_method, $is_big, '簽名值:');$param['signature'] = $signature;$types = explode('_',$api_method);if($types[0] == 'sk'){$requestUrl = $this->edUrl . $method;}else{$requestUrl = $this->zdUrl . $method;}$this->log($requestUrl, $api_method, $is_big, '請求url:');$this->log($param, $api_method, $is_big, '請求報文:');$res = $this->curl($requestUrl, $param);$this->log($res, $api_method, $is_big, '響應報文:');return $res;}/*** 生成簽名* @param $params array 請求參數* @param $privateKey string 秘鑰* @return $sign string 簽名內容*/public function makeSign($params){//簽名步驟一:按字典序排序參數,再把所有數組值以“&”字符連接起來ksort($params);$string = $this->toUrlParams($params);openssl_sign($string, $binary_signature, $this->privateKey, OPENSSL_ALGO_SHA256);$sign = base64_encode($binary_signature);return $sign;}/*** 格式化參數格式化成url參數* @param $params array*/public function toUrlParams($params){$buff = "";foreach ($params as $k => $v) {if ($v != "" && !is_array($v)) {$buff .= $k . "=" . $v . "&";}}$buff = trim($buff, "&");return $buff;}//接口post請求public function curl($url = '', $data = ''){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);if (!empty($data)) {curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);}curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_TIMEOUT, 30); //超時時間30秒curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($ch);curl_close($ch);return $output;}/*** 驗簽* @param $data array 需要驗簽的數據*/public function verifySign($data, $publicKey){if (empty($data) || empty($data['signature'])) {return false;}$sign = $data['signature'];unset($data['signature']);ksort($data);$string = $this->ToUrlParams($data);$pubKey = "-----BEGIN PUBLIC KEY-----\n" .wordwrap($publicKey, 64, "\n", true) ."\n-----END PUBLIC KEY-----";$result = (bool)openssl_verify($string, base64_decode($sign), $pubKey, OPENSSL_ALGO_SHA256);return $result;}/*** 日志記錄* @param $data /內容* @param $method /方法名* @param $phone /手機號* @param string $is_big /通道別名* @param string $title /標題*/public function Log($data, $method, $is_big, $title, $phone = ''){$str = is_array($data) ? json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $data;if (empty($phone)) {$content = '【' . date('Y-m-d H:i:s') . '】' . $title . $str . PHP_EOL;} else {$content = ' phone:' . $phone . '【' . date('Y-m-d H:i:s') . '】' . $title . $str . PHP_EOL;}$path = APPPATH . "../PAYLOG/$is_big/$method/";if (!is_dir($path)) { //判斷目錄是否存在 不存在就創建mkdir($path, 0777, true);}file_put_contents($path . date("Y-m-d") . '.txt', $content, FILE_APPEND);//換行分割file_put_contents($path . date("Y-m-d") . '.txt', '------------------------' . PHP_EOL, FILE_APPEND);}總結
以上是生活随笔為你收集整理的签名算法sha256withrsa,RSA数字证书公钥私钥生成,base64转码和文件日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 澳大利亚现在的时间和节气是什么?
- 下一篇: 0.000000015,等于多少比例尺?