2016-09-10 2 views
1

Являясь новым, чтобы пойти на язык, мне нужно создать Hmac in go language. Я создал Hmac в nodejs, вам нужно сгенерировать тот же Hamc в языке go. Пробовал следующий код, но получал точно другой результат. Я не знаю, что я делаю неправильно. Это то, что я пыталсяGo lang generate hmac

package main 

import (
    "crypto/hmac" 
    "crypto/sha256" 
    "encoding/base64" 
    "fmt" 
) 

func ComputeHmac256(message string, secret string) string { 
    key := []byte(secret) 
    h := hmac.New(sha256.New, key) 
    h.Write([]byte(message)) 
    return base64.StdEncoding.EncodeToString(h.Sum(nil)) 
} 

func main() { 
    fmt.Println(ComputeHmac256("sms1", "b5fb5b3a65b8429693c3a029308e2e46")) 
} 
Output: JVN7kUPFL0aQ09lIH4YOsFJA3A2faqTuu6zIaYo61VI= 

нужно идти эквивалент следующих nodejs кода

var crypto = require('crypto'), 
    text = 'sms1', 
    key = 'b5fb5b3a65b8429693c3a029308e2e46' 
var hash = crypto.createHmac('sha256', key) 
hash.update(text) 
var value = hash.digest('hex') 
// Output 
25537b9143c52f4690d3d9481f860eb05240dc0d9f6aa4eebbacc8698a3ad552 

ответ

8

Вы должны использовать ту же кодировку в программе Go, как вы делаете в вашей программе Node.js (hex):

package main 

import (
    "crypto/hmac" 
    "crypto/sha256" 
    "encoding/hex" 
    "fmt" 
) 

func ComputeHmac256(message string, secret string) string { 
    key := []byte(secret) 
    h := hmac.New(sha256.New, key) 
    h.Write([]byte(message)) 
    return hex.EncodeToString(h.Sum(nil)) 
} 

func main() { 
    fmt.Println(ComputeHmac256("sms1", "b5fb5b3a65b8429693c3a029308e2e46")) 
} 

https://play.golang.org/p/-1yePFeipT

+0

Большое спасибо @Tim. Ваш ответ действительно помог мне. – Dibish

+0

Если я хочу написать больше данных в hmac, могу ли я использовать h.Write() несколько раз? или мне нужно сбросить его, прежде чем я напишу следующее значение? –

Смежные вопросы