93 lines
2.8 KiB
Go
93 lines
2.8 KiB
Go
package sign
|
|
|
|
import (
|
|
"crypto"
|
|
"crypto/rand"
|
|
"crypto/rsa"
|
|
"crypto/sha1"
|
|
"crypto/x509"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"log"
|
|
"net/url"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
const APPID = "a23b2d45b0214f7ebbe167cd2e490435"
|
|
const PRI_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOAoyk5ot2KHo3hFga+ozeSO6XORk6wd4MkyETSGCDrha8klXfTukAJfYz3eS/PpkdLJTGrd34D21BkKzJ7Pc+ExMwTEc4xTaWU9vVJWlshVgHUsfbRhVps3IivtK9e268j+7xHf0I6j0zJ7zOLO6aADf76e/GqVfA+rz0DPPR3jAgMBAAECgYEA3blbSy2nX42dM6VE/zTw28hEwOzZbiFrrHearyJ4140MKb2Nb23eAorJxnOxG0YI2MAGl5p5rr331AFrnxbCnb4JZ5fnT1uBNtmH4uEnHhIhQm3CsSukFWvnO5KRD+9Zl3BKUSor2ynCs5/EO0hcKlKCYtHiXKzkkUi65rLuH4kCQQD2tlELA8YDMGgKNOF3ZpvRrTqKxGb4wwg+jUX4ns4oXutc57EfG4R96MWG5gu4x/3ZVrHPMHsmPClnK7hAyXP/AkEA6JkfBiLkhlCmkCn5F3qDwuQNzTHqdm/Ql71Hogk6+2itVgJ9ua+Eegw5cVynPqrEWW2e7VbNjuiVlkMLJE0GHQJBAKFCOCTf+YzaFhcdy4X1DsJ13T8Y80mEiZ4BT4wbmRswN92JH+/6V5bJEFuFgIHuTxHBpgWMZeJvDoz+Obg3NVcCQE+tdFUzyrjAE+66khua2lv+p0OtX7Xmo7v3GPzG0K+isg4OmGbtWyI74cmVha0P7mb8CD8hRxU3U1a/7Kcow3kCQQCky3My+Qr+offSBqBE1cuFbkJ09G6nlotlPlO0pVnXOHMsUBCkfocv6QJ25KooppU1C1Cktgf9BYJ9b/r+r1Lu"
|
|
const HOST = "http://openapi.hopewindcloud.com/"
|
|
|
|
// 对参数进行签名,并为 Map 添加 appid 和 sign 参数
|
|
func SignByRSA(params map[string]string) string {
|
|
params["appid"] = APPID
|
|
content := CreateLinkString(params)
|
|
privateKeyBytes, err := base64.StdEncoding.DecodeString(PRI_KEY)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
pkcs8PrivateKey, err := x509.ParsePKCS8PrivateKey(privateKeyBytes)
|
|
if err != nil {
|
|
log.Fatalf("Failed to parse PKCS#8 private key: %v", err)
|
|
}
|
|
privateKey, ok := pkcs8PrivateKey.(*rsa.PrivateKey)
|
|
if !ok {
|
|
log.Fatal("Private key is not of type RSA")
|
|
}
|
|
h := sha1.New()
|
|
_, err = h.Write([]byte(content))
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return ""
|
|
}
|
|
hashed := h.Sum(nil)
|
|
signed, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA1, hashed)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return ""
|
|
}
|
|
sign := url.QueryEscape(base64.StdEncoding.EncodeToString(signed))
|
|
params["sign"] = sign
|
|
return sign
|
|
}
|
|
|
|
// paramsFilter 过滤参数
|
|
func paramsFilter(params map[string]interface{}) map[string]string {
|
|
result := make(map[string]string)
|
|
if params == nil || len(params) == 0 {
|
|
return result
|
|
}
|
|
for key, value := range params {
|
|
if value == nil || key == "sign" {
|
|
continue
|
|
}
|
|
result[key] = value.(string)
|
|
}
|
|
return result
|
|
}
|
|
|
|
// createLinkString 创建链接字符串
|
|
func CreateLinkString(params map[string]string) string {
|
|
if params == nil {
|
|
return ""
|
|
}
|
|
// 排序键
|
|
keys := make([]string, 0, len(params))
|
|
for key := range params {
|
|
keys = append(keys, key)
|
|
}
|
|
sort.Strings(keys)
|
|
sb := strings.Builder{}
|
|
keyLastNum := len(keys) - 1
|
|
for i, key := range keys {
|
|
value := params[key]
|
|
sb.WriteString(key)
|
|
sb.WriteString("=")
|
|
sb.WriteString(value)
|
|
if i != keyLastNum {
|
|
sb.WriteString("&")
|
|
}
|
|
}
|
|
return sb.String()
|
|
}
|