IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 签名校验 go & php -> 正文阅读

[PHP知识库]签名校验 go & php

一.签名传参(统一在header头里面进行传递)

参数名称参数说明
sign签名值
ak调用方标识,服务端根据此标识匹配SK秘钥
timestamp签名时间戳,服务端需要进行过期检测

二.签名步骤

1.GET请求

将URL请求中的传参构造成url方式得到urlstring如:a=1&b=2&c=3
根据请求来源确定加密秘钥SK(秘钥可以是设备ID+动态token根据业务进行确定)
拼接加密串 urlstring+timestamp(请求参数+请求时间)如:a=1&b=2&c=31565233578
使用hmac方式的sha256将串加密,然后再base64的到签名串
php代码示例:
base64_encode(hash_hmac(‘sha256’, ‘a=1&b=2&c=31565233578’, ‘SK’, true))
将签名sign和签名时间timestamp=1565233578放入header头传入

2.POST请求-formurlencode格式

统一设置header请求格式Content-Type:application/x-www-form-urlencoded
请求参数构造成url方式并得到(按参数名字母排序)urlstring如:a=b&c=d%22%5Ctest abc=1&abd=2&abe=3&bab=4
根据请求来源确定加密秘钥SK
拼接加密串 urlstring+timestamp(请求参数+请求时间)如:a=b&c=d%22%5Ctest1565233578
使用hmac方式的sha256将串加密,然后再base64的到签名串
php代码示例:
base64_encode(hash_hmac(‘sha256’, ‘a=b&c=d%22%5Ctest1565233578’, ‘SK’, true))
将签名sign和timestamp放入header头传入

3.POST请求form-data格式(兼容模式-不建议使用)

统一设置header请求格式Content-Type:multipart/form-data
同二

4.POST请求JSON格式

统一设置header请求格式Content-Type:application/json
需要传入的json串jsonstring如:{“a”:“b”,“c”:123}
根据请求来源确定加密秘钥SK
拼接加密串 jsonstring+timestamp(请求参数+请求时间)如:{“a”:“b”,“c”:123}1565233578
使用hmac方式的sha256将串加密,然后再base64的到签名串
php代码示例:
base64_encode(hash_hmac(‘sha256’, ‘{“a”:“b”,“c”:123}1565233578’, ‘SK’, true))
将签名sign和timestamp放入header头传入

三.签名示例

1.GET方式

2.POST x-www-form-urlencoded方式

3.POST JSON方式

四.其他代码加密实例

https://www.jokecamp.com/blog/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/

php demo代码块

<?php
//Example:
//GET请求
// $url = 'http://149.129.215.154:8084/api/v1/internal/account/billday';
// $ak = 'order_main';
// $request_data = ['uid' => 1920910];
// $data = CommonSignService::curlData($url, $request_data, $ak, 'GET');
// var_dump($data);
// exit;


//POST示例
// $url = 'http://149.129.215.154:8084/api/v1/internal/account/amount';
// $ak = 'order_main';
// $request_data = [
//     'amount' => 800000,
//     'op' => 'op',
//     'product_id' => 202,
//     'uid' => 1920910,
// ];
// $data = CommonSignService::curlData($url, $request_data, $ak, 'POST', 'json');
// var_dump($data);
exit;


/**
 * 统一签名校验类
 * Created by PhpStorm.
 * User: liubin
 * Date: 2019-08-16
 * Time: 17:19
 * Version: 0.0.1
 */
class CommonSignService
{
    //请求返回的curl_no
    public static $last_curl_no;

    //请求返回的http_code
    public static $last_curl_http_code;

    //秘钥配置-根据调用方配置 ak => sk_env
    protected static $AK_SK_LIST = [
        'admin_order' => 'INTERNAL_ADMIN_ORDER_SK', //后台调用订单
        'admin_main' => 'INTERNAL_ADMIN_MAIN_SK',   //后台调用主干
        'order_main' => 'INTERNAL_ORDER_MAIN_SK',   //订单调用主干
        'main_order' => 'INTERNAL_MAIN_ORDER_SK',   //主干调用订单
    ];

    protected static $CONTENT_TYPE = [
        'json' => 'Content-Type:application/json',
        'urlencode' => 'Content-Type:application/x-www-form-urlencoded'
    ];

    public static function init()
    {
        self::$last_curl_no = 0;
        self::$last_curl_http_code = 0;
    }

    /**
     * 签名加密
     * @param $req_data array 请求数据
     * @param $timestamp int  时间戳
     * @param string $ak string 对应ak值
     * @return string
     */
    public static function encryptSign($req_data, $timestamp, $ak = 'order_main')
    {
        $sign_data = $req_data;
        if (is_array($req_data)) {
            ksort($req_data);
            $sign_data = http_build_query($req_data);
        }
        //$sk = '0l21&QMBPNs3xrLmArr@M6tD18SZ7topVFgBiL@0';
        //在配置文件里配置秘钥
        $sk = env(self::$AK_SK_LIST[$ak]);
        $sign = base64_encode(hash_hmac('sha256', $sign_data . $timestamp, $sk, true));
        return $sign;
    }

    /**
     * 统一内部curl请求
     * 带签名校验
     * @param $url string   请求地址
     * @param $data array   请求数据(传入数组)
     * @param $ak string    请求的ak
     * @param string $method 请求方法:POST,GET,DELETE,PUT 其他的再扩展
     * @param string $content_type 请求方法目前支持:urlencode 和 json
     * @param array $headers 请求头设置,如有需要设置传字符串数组
     * @param int $timeout_ms 请求超时时间:默认5000毫秒 = 5秒
     * @return bool|string
     */
    public static function curlData($url, $data, $ak, $method = 'GET', $content_type = 'urlencode', $headers = [], $timeout_ms = 5000)
    {
        if (!is_array($data)) {
            return false;
        }
        if (!in_array($method, ['GET', 'POST', 'PUT', 'DELETE'])){
            return false;
        }
        self::init();
        $ch = curl_init();
        $timestamp = time();
        $headers[] = 'ak:' . $ak;
        $headers[] = 'timestamp:' . $timestamp;
        empty($content_type) && $content_type = 'urlencode';
        if ($method == 'POST' || $method == 'DELETE' || $method == 'PUT') {
            switch ($content_type) {
                case 'json':
                    $sign_data = json_encode($data);
                    break;
                case 'urlencode':
                default:
                    ksort($data);
                    $sign_data = http_build_query($data);
                    break;
            }
            $headers[] = self::$CONTENT_TYPE[$content_type];
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $sign_data);
        } else if ($method == 'GET') {
            ksort($data);
            $sign_data = http_build_query($data);
            $url = $url . '?' . $sign_data;
        } else {
            return false;
        }
        $sign = self::encryptSign($sign_data, $timestamp, $ak);
        $headers[] = 'sign:' . $sign;
        if (!empty($timeout_ms)) {
            curl_setopt($ch, CURLOPT_TIMEOUT_MS, $timeout_ms);
        }
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        self::$last_curl_no = curl_errno($ch);
        self::$last_curl_http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return $output;
    }
}
?>

go demo 代码块



  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:17:00  更:2021-09-04 17:17:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:26:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码