如何设计签名保护接口安全

版权声明:如果转载请注明出处,不喜勿喷,谢谢 https://blog.csdn.net/qq_38358436/article/details/88888727

参考: http://www.cnblogs.com/codelir/p/5327462.html

签名的主要作用

  • 请求来源(身份)是否合法?
  • 请求的唯一性(不可重复请求)

步骤

  • 服务端给客户端分配 app_id app_secret
  • 客户端和服务端通过指定的算法生成签名 sign
  • 客户端每次请求都把 app_id 和生成好的 sign 放到请求参数中传递给服务端
  • 服务端拿出客户端传递的 app_id 对应的 app_secret 通过算法生成一个 sign 和客户端传递的 sign 对比

注意: app_secret 只是为了生成 sign 用的,请不要将 app_secret 放到请求参数中

关于算法

  • 将所有请求参数加入到算法中
  • 将时间戳加入到算法中(注意: js获取的时间戳和PHP获取的时间戳格式不一致)
  • app_secret 加入到算法中

举个例子, 此处以 jquery 和 laravel 为例

使用 axios 的话,原理也是一样的

  • 客户端代码
<script src="jquery.min.js"></script>
<script>
    $(function () {
        // 请求参数
        var params = {
            id: 1,
            app_id: 'xKYf550dzriIVeZbrcz2WpAMV0SOMCelpUcNfLDWm9vf1BdsT41uvqVE3PLH7lQx'
        };

        /**
         * 生成签名加密算法
         * @param $params
         */
        function signGenerator($params) {
            // 获取秘钥和请求参数循环组成: secret:key=value&key=value&timestamp
            var secret = 'fw2FZjjmvKlpoByizWfScZbAluXdNwooABu93LEdKRV5ZOtJKrL7LEosb4IGBw4W';

            var sign = secret + ':';
            for (var key in params) {
                sign += key + '=' + $params[key] + '&';
            }

            // 获取PHP格式的时间戳
            var timestamp = (new Date()).getTime() / 1000;
            console.log("客户端生成的签名:", window.btoa(sign + Math.floor(timestamp)));

            // window.btoa是js内置的base64加密算法
            return window.btoa(sign + Math.floor(timestamp));
        }

        // 发送请求
        $.ajax({
            type: "GET",
            url: "https://www.example.com/api/test",
            data: params,
            beforeSend: function (request) {
                // 将签名添加到请求头中
                request.setRequestHeader("sign", signGenerator(params));
            },
            success: function (response) {
                console.log(JSON.stringify(response));
            }
        });
    });
</script>
  • 服务端代码
    此处使用的是laravel的中间件

猜你喜欢

转载自blog.csdn.net/qq_38358436/article/details/88888727