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() }