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

本文介绍了如何使用Go来实现百度联盟媒体平台的DSA签名过程,包括AccessKey的获取、IP白名单设置、DSA密钥对的生成及HTTP请求头中签名的添加方法。文中还提供了Go代码示例,用于生成签名,欢迎交流和反馈。
摘要由CSDN通过智能技术生成

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

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"
+ ""

私钥文件:

-----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-----

PHP生成签名方法:

<?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 . "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值