API 认证参数

所有接口都需要以下通用认证参数,请参考以下示例。

  • Name
    AccessKeyId
    Type
    string
    Description

    用户的访问密钥ID

  • Name
    SignatureNonce
    Type
    string
    Description

    签名随机数

  • Name
    Timestamp
    Type
    string
    Description

    请求时间戳(秒),有效期30秒

  • Name
    Signature
    Type
    string
    Description

    使用 HmacSHA1 + Base64 生成的签名


参考示例

package main

import (
  "crypto/hmac"
  "crypto/sha1"
  "encoding/base64"
  "encoding/hex"
  "fmt"
  "math/rand"
  "strconv"
  "time"
)

// GenerateSignature 生成API签名
// accessKeyId: 访问密钥ID
// accessSecret: 访问密钥
// signatureNonce: 签名随机数,不传则自动生成
// timestamp: 时间戳,不传则使用当前时间
func GenerateSignature(accessKeyId, accessSecret string, signatureNonce *string, timestamp *int64) string {
  // 如果未传入signatureNonce,则生成随机字符串
  nonce := ""
  if signatureNonce == nil {
    // 生成8位随机字符串
    b := make([]byte, 4)
    rand.Read(b)
    nonce = hex.EncodeToString(b)
  } else {
    nonce = *signatureNonce
  }

  // 如果未传入timestamp,则使用当前时间戳
  ts := ""
  if timestamp == nil {
    ts = strconv.FormatInt(time.Now().Unix(), 10)
  } else {
    ts = strconv.FormatInt(*timestamp, 10)
  }

  // 构建签名前的字符串
  str := fmt.Sprintf("AccessKeyId=%s&SignatureNonce=%s&Timestamp=%s", 
    accessKeyId, nonce, ts)

  // 使用HMAC-SHA1生成签名并转换为hex
  h := hmac.New(sha1.New, []byte(accessSecret))
  h.Write([]byte(str))
  hexSignature := hex.EncodeToString(h.Sum(nil))

  // 将hex编码转为base64
  return base64.StdEncoding.EncodeToString([]byte(hexSignature))
}

// 使用示例
func main() {
  accessKeyId := "975988f45090561684b7d8f4e45b85c2"
  accessSecret := "957f23f2d6435e37d4ac21f3e9a67d45"
  signatureNonce := "2"
  timestamp := int64(1612149637)

  // 生成新签名
  newSignature := GenerateSignature(
    accessKeyId,
    accessSecret,
    &signatureNonce,
    &timestamp,
  )

  // 验证示例
  oldSignature := "M2Y0ODNlYTUwNDFiMTg5MjRmMGQxNmY1YTMyMzc1NTc5NTUzNDAzYw=="

  if newSignature == oldSignature {
    fmt.Println("签名验证成功")
  } else {
    fmt.Println("签名验证失败")
  }

  fmt.Println("新生成的签名:", newSignature)
}

您对本页面是否满意?