最近 接口对接的比较多, 各种签名方式吧, 简单记录一下
API签名验证
这里我们引入业内比较通用的签名验证来对接口进行参数加密,有以下优势。
-
请求的唯一性:计算出的签名是唯一的,可以用来验证。
-
参数的可变性:参数中包含时间戳参数,这就保证每次的请求计算出得签名都是不一。
-
请求的时效:由于请求中带有当前发起请求的时间戳参数,服务端可以对时间戳进行验证,过滤超出时效的请求。
-
安全性:即使请求被人恶意抓包,对方恶意篡改其中的参数,那么签名都是错误的,参数无法修改。
签名原则上就是为了 加密接口,防止别人 通过接口不停 的刷数据 ,只要达到目的就可以。
md5
MD5(参数1.参数2.参数3.参数4)
这种方式比较简单,
sha1()
sha1(getJieSign($_list))
这种方式, 最好让参数 ascii码排序
/** * 签名算法 * @param array $list * @return string 返回签名数据 */ function getJieSign($para) { ksort($para); reset($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; }
sha1WithRSA()
genSign(getJieSign($_list),$privateKey);
//生成 sha1WithRSA 签名 function genSign($toSign, $privateKey){ $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($privateKey, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; $key = openssl_get_privatekey($privateKey); openssl_sign($toSign, $signature, $key); openssl_free_key($key); $sign = base64_encode($signature); return $sign; } //校验 sha1WithRSA 签名 function verifySign($data, $sign, $pubKey){ $sign = base64_decode($sign); $pubKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----"; $key = openssl_pkey_get_public($pubKey); $result = openssl_verify($data, $sign, $key, OPENSSL_ALGO_SHA1) === 1; return $result; }