zoukankan      html  css  js  c++  java
  • 接口签名生成+验证

         在做一些api接口设计时候会遇到设置权限问题,比如我这个接口只有指定的用户才能访问。
    很多时候api接口是属于无状态的,没办法获取session,就不能够用登录的机制去验证,那么
    大概的思路是在请求包带上我们自己构造好的签名,这个签名必须满足下面几点:

    1. 唯一性,签名是唯一的,可验证目标用户
    2. 可变性,每次携带的签名必须是变化的
    3. 时效性,具有一定的时效,过期作废
    4. 完整性,能够对数据包进行验证,防止篡改
    <?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, $data) { // 对数组的值按key排序 ksort($data); // 生成url的形式 $params = http_build_query($data); // 生成sign $sign = md5($params . $secret); return $sign; } // 发送的数据加上sign $data['sign'] = getSign($secret, $data); /** * 后台验证sign是否合法 * @param [type] $secret [description] * @param [type] $data [description] * @return [type] [description] */ function verifySign($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('请求不合法'); } }

      

  • 相关阅读:
    文字编码
    各个地区的编码
    Android中调用系统所装的软件打开文件
    Android中检测手机制式和移动网络类型
    Android使用ContentProvide(内容提供者)向其他应用程序共享数据
    windows Phone Push Notification
    解决Android加载图片时内存溢出的问题
    Android 正则表达式
    淡定
    Android简单数据存储类SharedPreferences详解及实例
  • 原文地址:https://www.cnblogs.com/xuchuanbing/p/15767680.html
Copyright © 2011-2022 走看看