• 使用GO代码实现 百度联盟媒体平台的DSA签名


    1. AccessKey
    百度百度联盟将为每一个会员账号分配一个16 位字母数字组成的字符串,作为账号的
    唯一标识。由百度联盟商务合作经理于线下发给会员。
    2. IP 白名单
    百度联盟会员需要线下向百度百度联盟平台提供欲访问API 的 IP 地址列表。目前不支
    持 IP 段。
    3. DSA 私钥公钥对
    会员需要自己生成 PEM 格式的 DSA 私钥公钥对,并妥善保管好私钥,同时将公钥
    线下提供给百度百度联盟平台。

    生成方法:
    1. 生成随机参数
    openssl dsaparam -out dsaparam.pem 1024
    2. 生成 DSA 私钥 privkey.pem
    openssl gendsa -out privkey.pem dsaparam.pem
    3. 生成公钥 pubkey.pem
    openssl dsa -in privkey.pem -pubout -out pubkey.pem
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4. API 的 HTTP 请求头
    为了验证平台身份,需要在HTTP Header 中额外增加以下两项内容:
    4. x-ub-authorization: 用户信息+请求信息的签名(签名算法见下一小结),
    格式为:${AccessKey}: ${Signature}。
    5. x-ub-date: 请求的时间,格式为Unix-Time 时间戳。

    5. 签名算法
    需要将以下内容用“\n”连接起来,作为待签名的数据。然后将待签名的数据用DSA
    私钥通过SHA1 算法加密编码,加密后的结果(字节数组)使用BASE64 进行编码,
    作为签名使用。

    1. 用户的AccessKey
    2. HTTP Method(GET、POST、PUT 等),见接口定义中的HTTP 方法
    3. 请求的资源的url及query参数(不包含协议及Host 部分),见接口定义中的URL
    4. x-ub-date 时间戳
    例如:
    
    11. GET 请求
    // 用户的Access Key 为 ABCDEFGHIJKLMN12
    // 当前的 unix 时间为 1387106898
    // GET /union/11.0/apps?page=1&count=10
    ==== 待签名的内容,不包含本行内容 ====
    "ABCDEFGHIJKLMN12\n"
    + "GET\n"
    + 
    "/ssp/1/sspservice/app/app-report/get-app-report?begindate=20190901&
    enddate=20190902\n"
    + "1387106898\n"
    + "\n"
    + ""
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    私钥文件:

    -----BEGIN DSA PRIVATE KEY-----
    MIIBvAIBAAKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADDHj+123456789
    +1k9jVj6v8X1ujD2y5tVbNeBO4AdNG/123456789+gEexAiwk+7qdf+t8Yb
    +DtX58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdg
    UI8VIwvMspK5gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlX
    TAs9B4JnUVlXjrrUWU/mcQcQgYC0SRZxI+12345678991233333
    rh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQB
    QQv+z0kqAoGBAMi2XZH2ebKSwLuRdWnWJYug/12345677898989/M+MhQLK
    V6+foRix6Z5nsYLZI0eLcTLEcE+kfiNuWegU7gca0chHM/Kc2TgO1U8HSsSsoFgt
    GCtN+66777899454545566565/dSKihFAhRHC4BI
    2244+aFh/123456789998878787==
    -----END DSA PRIVATE KEY-----
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    PHP生成签名方法:

    
    
    class UbapiClient {
       
        private $host = "https://ubapi.baidu.com";
        private $private_key;
        private $accessKey;
    
        /**
         * @param $privkeyPath 私钥的文件路径
         * @param $accessKey access key
         * @return UbapiClient
         */
        function __construct($privkeyPath, $accessKey) {
       
    
            // 1. read private key
            $fp = fopen($privkeyPath, "r");
            $cert = fread($fp, 8192);
            fclose($fp);
            $this->private_key = openssl_get_privatekey($cert);
    
            $this->accessKey = $accessKey;
    
        }
    
        /**
         * 发起GET请求
         * @param @uri 例如 /ssp/1/report?date=20151127
         * @return (状态码,响应的body内容)
         */
        function doGet($uri) {
       
            $method = "GET";
            $contentType = "";
            $bodyMd5 = "";
            $timestamp = time();
    
            $message = $this->accessKey . "\n" . $method . "\n" . $uri . "\n" . $timestamp . "
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    CDQ分治模板
    2023南京审计大学计算机考研信息汇总
    Jmeter UI详细介绍及脚本生成,get,转发收藏
    C语言对单链表所有操作与一些相关面试题
    Android13 adb 无法连接?
    将风险前置
    深入学习JVM底层(四):类文件结构
    .NET NativeAOT 指南
    CSS 什么是伪类?什么是伪元素?
    1_SpringMVC_概述,2_SpringMVC_项目搭建
  • 原文地址:https://blog.csdn.net/weixin_46124208/article/details/127728487