签名算法
签名算法 | |
---|---|
加密方式 | RSA |
加密方法 | SHA1 |
长度 | 2048 |
格式 | PKCS1v15 |
私钥 | private_key_pem |
构造签名
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
RsaNo | string | 是 | 合作商编号 |
Time | int | 是 | 当前时间戳 |
.... | .... | 否 | 每个接口需要的参数 |
每次接口请求之前都需要构造签名获得token,将token带入header头部正常请求接口
下面是go语言签名示例代码:
package main
import (
"bytes"
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
"fmt"
"io"
"net/http"
"os"
"time"
)
const (
apiURL = "https://www.90daili.com/Api/ProjectList" // API路径
rsaID = "******" // 用户编号,根据实际情况替换
privateKeyPath = "private.pem" // 私钥文件路径
)
func main() {
// 生成请求体
requestBody := fmt.Sprintf(`{"Time":"%d","RsaNo":"%s"}`, time.Now().Unix(), rsaID)
// 签名Token
token, err := GenerateToken(requestBody, privateKeyPath)
if err != nil {
fmt.Println("Error token:", err)
os.Exit(1)
}
// 创建HTTP请求
req, err := http.NewRequest("POST", apiURL, bytes.NewBufferString(requestBody))
if err != nil {
fmt.Println("Error request:", err)
os.Exit(1)
}
// 设置必要的Headers
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Token", token)
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
os.Exit(1)
}
defer resp.Body.Close()
// 读取响应体
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response body:", err)
os.Exit(1)
}
fmt.Println(string(body))
}
// 加载私钥文件
func loadPem(path string) ([]byte, error) {
return os.ReadFile(path)
}
// SignRSA 对提供的数据进行RSA签名
func SignRSA(data string, privateKey string) (string, error) {
block, _ := pem.Decode([]byte(privateKey))
if block == nil {
return "", errors.New("private key error")
}
privKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return "", err
}
hasher := crypto.SHA1.New()
hasher.Write([]byte(data))
hashed := hasher.Sum(nil)
signature, err := rsa.SignPKCS1v15(rand.Reader, privKey.(*rsa.PrivateKey), crypto.SHA1, hashed)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(signature), nil
}
// 生成请求体和签名Token
func GenerateToken(requestBody string, privateKeyPath string) (string, error) {
privateKey, err := loadPem(privateKeyPath)
if err != nil {
fmt.Println("load pem error:", err)
return "", err
}
privateKeyStr := string(privateKey)
token, err := SignRSA(requestBody, privateKeyStr)
if err != nil {
return "", err
}
return token, nil
}
如有疑问,请联系九零IP在线客服
九零代理IP —— 全球高速代理,助力您的商业腾飞!
🌍 覆盖全球,高速稳定
九零代理IP拥有海量优质IP资源,覆盖国内300+城市地区,高速稳定,匿名性强,满足您的游戏搬砖、自媒体、数据采集、SEO优化、广告投放等多场景需求!
🔒 安全可靠,专业保障
采用高匿名加密技术,严格保护用户隐私,确保您的网络操作安全无忧。7×24小时专业技术支持,随时为您解决后顾之忧!
💼 商业合作,互利共赢
诚邀企业、开发者、跨境电商、营销团队等合作伙伴,共同开拓市场!我们提供灵活的合作方案,定制化服务,助力您的业务高效增长!
📩 联系我们
九零IP官网:www.90daili.com
微信:19871648261、
QQ:639317776
选择九零代理IP,携手共赢未来! 🚀