Golang crypto / hmac глобальный хеш-объект - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь использовать глобальный хэш hmac для генерации подписи. Код работает хорошо, но сгенерированная подпись не удовлетворяет требованиям стороннего интегратора. Если для каждого процесса «генерации подписи» будет создан хэш hmac, он будет работать нормально.

Работает нормально - подпись принимается третьей стороной:

func tokenSignatureFunc(key string) tokenSignType {
    signToken := func(token string) []byte {
        h := hmac.New(sha256.New, []byte(key))
        h.Write([]byte(token))
        signature := h.Sum(nil)
        base64Signature := make([]byte, base64.StdEncoding.EncodedLen(len(signature)))
        base64.StdEncoding.Encode(base64Signature, signature)
        return base64Signature
    }
    return signToken
}

Не работает - подпись не принимается третьей стороной:

func tokenSignatureFunc(key string) tokenSignType {
    h := hmac.New(sha256.New, []byte(key))
    signToken := func(token string) []byte {
        h.Write([]byte(token))
        signature := h.Sum(nil)
        base64Signature := make([]byte, base64.StdEncoding.EncodedLen(len(signature)))
        base64.StdEncoding.Encode(base64Signature, signature)
        return base64Signature
    }
    return signToken
}

1 Ответ

0 голосов
/ 08 сентября 2018

Попробуйте, это может быть сбой из-за заполнения base64. Используйте RawStdEncoding вместо

func HMAC256(payload string, secret string) string {
   sig := hmac.New(sha256.New,[]byte(secret))
   sig.Write([]byte(payload))
   return b64Encode(string(sig.Sum(nil)[:]))
}


func b64Encode(text string) string {
   return base64.RawStdEncoding.EncodeToString([]byte(text))
 }
...