摘要:寫了一個用PHP生成PSA和RSA2算法簽名和驗簽的工具類,在支付等接口方面通常會用到,下面是代碼:class RSA2{ /** * RSA2簽名 ...
寫了一個用PHP生成PSA和RSA2算法簽名和驗簽的工具類,在支付等接口方面通常會用到,下面是代碼:
class RSA2{ /** * RSA2簽名 * @param $data 待簽名數據 * @param $private_key 私鑰字符串 * return 簽名結果 */ function rsaSign($data, $private_key, $sign_type=OPENSSL_ALGO_SHA256) { $search = [ "-----BEGIN RSA PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----", "\n", "\r", "\r\n" ]; $private_key = str_replace($search,"",$private_key); $private_key = $search[0] . PHP_EOL . wordwrap($private_key, 64, "\n", true) . PHP_EOL . $search[1]; $res = openssl_get_privatekey($private_key); if($res){ openssl_sign($data, $sign, $res, $sign_type); openssl_free_key($res); }else { exit("私鑰格式有誤"); } $sign = base64_encode($sign); return $sign; } /** * RSA2驗簽 * @param $data 待簽名數據 * @param $public_key 公鑰字符串 * @param $sign 要校對的的簽名結果 * return 驗證結果 */ function rsaCheck($data, $public_key, $sign, $sign_type=OPENSSL_ALGO_SHA256) { $search = [ "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----", "\n", "\r", "\r\n" ]; $public_key = str_replace($search,"",$public_key); $public_key = $search[0] . PHP_EOL . wordwrap($public_key, 64, "\n", true) . PHP_EOL . $search[1]; $res = openssl_get_publickey($public_key); if($res){ $result = (bool)openssl_verify($data, base64_decode($sign), $res); openssl_free_key($res); }else{ exit("公鑰格式有誤!"); } return $result; } } $str = 'yzmcms123456789'; echo '待簽名的數據是:' . $str . '<hr>'; $obj = new RSA2(); //生成RSA2簽名 $sign = $obj->rsaSign($str, file_get_contents('private.txt')); echo '簽名后的數據是:' . $sign . '<hr>'; //驗簽 RSA2 if($obj->rsaCheck($str, file_get_contents('public.txt'), $sign)){ echo '驗證成功'; }else{ echo '驗證失敗'; }
默認簽名方式為RSA(OPENSSL_ALGO_SHA256),如果使用RSA也比較簡單只需要在調用簽名和驗簽的方法里面多增加最后一個參數為OPENSSL_ALGO_SHA1就可以了,增加參數后執行的對應方法內的代碼如下:
//簽名 RSA openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA1); //驗簽 RSA openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA1);
網友評論:
666
2020-04-06 23:37:05 回復
網友評論:
多端
2020-03-26 11:59:48 回復