zoukankan      html  css  js  c++  java
  • PHP 开发API接口签名生成以及验证

    开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证。
    我们在设计签名验证的时候,请注意要满足以下几点:
    可变性:每次的签名必须是不一样的。
    时效性:每次请求的时效,过期作废等。
    唯一性:每次的签名是唯一的。
    完整性:能够对传入数据进行验证,防止篡改。
    <?php
    // 设置一个公钥(key)和私钥(secret),公钥用于区分用户,私钥加密数据,不能公开
    $key = "c4ca4238a0b923820dcc509a6f75849b";
    $secret = "28c8edde3d61a0411511d3b1866f0636";
    // 待发送的数据包
    $data = array(
    'username' => 'abc@qq.com',
    'sex' => '1',
    'age' => '16',
    'addr' =>
    'guangzhou',
    'key' => $key,
    'timestamp' => time(),
    );
    // 获取 sign
    function getSign(secret,secret,data) {
    // 对数组的值按 key 排序
    ksort($data);// 生成 url 的形式
    $params = http_build_query($data);// 生成 sign
    $sign = md5($params . $secret);
    return $sign;
    }
    // 发送的数据加上 sign
    data['sign'] = getSign(data[′sign′]=getSign(secret, $data);
    /** 后台验证 sign 是否合法 @param [type] $secret [description] @param [type] $data [description] @return [type] [description] */ function verifySign(secret,secret,data) { // 验证参数中是否有签名 if (!isset($data['sign']) || !$data['sign']) { echo '发送的数据签名不存在'; die(); }if (!isset($data['timestamp']) || !$data['timestamp']) { echo '发送的数据参数不合法'; die(); } // 验证请求, 10 分钟失效 if (time() - $data['timestamp'] > 600) { echo '验证失效, 请重新发送请求'; die(); } $sign = $data['sign'];unset($data['sign']); ksort($data); $params = http_build_query($data);// $secret 是通过 key 在 api 的数据库中查询得到 $sign2 = md5($params . $secret); if ($sign == $sign2) { die('验证通过'); } else { die('请求不合法'); } } ?>
  • 相关阅读:
    RPC
    动词 or 名词 :这是一个问题 【转载】
    js 如何清除setinterval
    封装动画特效
    飞入特效
    建字段_添加数据_生成json.php
    mybatis由浅入深day02_9.3.5使用生成的代码_9.4逆向工程注意事项
    mybatis由浅入深day02_9逆向工程
    mybatis由浅入深day02_8spring和mybatis整合
    mybatis由浅入深day02_7.4mybatis整合ehcache_7.5二级缓存应用场景_7.6二级缓存局限性
  • 原文地址:https://www.cnblogs.com/jackzhuo/p/13784601.html
Copyright © 2011-2022 走看看