API常用签名验证方法(PHP实现)-php教程

资源魔 31 0

应用场景

如今愈来愈多的名目应用的先后端别离的模式进行开发,后端开发职员应用API接口授递数据给到前端开发进行解决展现,正在一些比拟首要的修正数据接口,触及款项,用户信息等修正的接口假如没有做防护验证,常常容易被人歹意刷接口,招致微小的丧失。

API署名验证

这里咱们引入业内比拟通用的署名验证来对接口进行参数加密,有如下劣势。

  • 申请的惟一性:较量争论出的署名是惟一的,能够用来验证。

  • 参数的可变性:参数中蕴含工夫戳参数,这就保障每一次的申请较量争论出患上署名都是纷歧样的。

  • 申请的时效:因为申请中带有以后发动申请的工夫戳参数,效劳端能够对工夫戳进行验证,过滤凌驾时效的申请。

  • 平安性:即便申请被人歹意抓包,对方歹意窜改此中的参数,那末署名都是谬误的,参数无奈修正。

理论出真谛

1. 对map类型(即一组键值对)的待署名数据依据键的巨细进行排序。map中各参数按字母程序排序,假如第一个字母相反,按第二个字母排序,顺次类推。例如

{
    "timestamp": "2017-06-08 09:38:00",
    "format": "xml",
    "app_id": "aabbc",
    "cp_extend_info": "",
    "sign_type": "HMAC-SHA1",
    "sign": "abc"
}

那末,排序后变为

{
    "app_id": "aabbc",
    "cp_extend_info": "",
    "format": "xml",
    "sign_type": "HMAC-SHA1",
    "timestamp": "2017-06-08 09:38:00"
}

留意:假如map中蕴含署名的参数(sign)需求过滤该参数的键值没有参加署名,不值的参数请没有要参加署名

2. 对排序后的map进行序列化解决成待署名字符串,拼接后的待署名字符串为

app_id=aabbc&format=xml&sign_type=HMAC-SHA1&timestamp=2017-06-08 09:38:00

3. 依据HMAC-SHA1算法应用密钥提取待署名字符串的择要(hash)署名并进行base64_encode编码(便于显性传输以及比照),假定署名密钥为 test ,则提掏出的择要署名并进行base64_encode的值为

JqoEqPIVVor0eyRHMYiZftsycVo=

留意:因为有些数据依据HTTP协定需要,正在网络传输进程中需求进行URLencoding,这样接纳刚才能够接纳到正确的参数,但若这个参数参加署名,那末待署名字符串必需是字符串原值而非URLencoding 的值。

代码理论

PHP示例

/**
 * 应用密钥天生HMAC-Sha1署名
 * @param array $params 申请参数
 * @param string $signKey 署名密钥
 * @return string
 */
function hmacSha1Sign($params,$signKey)
{
    ksort($params);
 
    $paramString = '';
    foreach ($params as $key => $value) {
        if (is_null($value) || $value=='' || $key == 'sign') {
            continue;
        }
        $paramString .= $key.'='.$value.'&';
    }
    $paramString = substr($paramString,0,-1);
    $sign = base64_encode(hash_hmac("sha1", $paramString, $signKey, $raw_output=TRUE));
    return $sign;
}

以上就是一样平常开发中罕用的API验证署名形式,很简略又十分应用,欢送存眷猎取更多的教程。

以上就是API罕用署名验证办法(PHP完成)的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 api

抱歉,评论功能暂时关闭!