Go言語でHMACを利用する方法

Golang

Go言語でのHMAC(Hash-based Message Authentication Code)の使用方法について紹介します。godoc.orgのHMACの説明(https://godoc.org/crypto/hmac)を参考にしています。

HMACを使用してハッシュ化した値を返す

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

Hmacを使用してハッシュ化したいメッセージを第1引数, シークレットキーを第2引数としたファンクションを作成しています。
ファンクション内について、順を追って解説します。

1行目では、まずshar256と第2引数として得られたkeyを利用してハッシュを作成しています。hmac.New()ではハッシュ(Hash interface)が返ります。また、keyは利用する前にバイトスライス[]byte()にコンバートしている点に注意してください。


2行目で作成したハッシュにメッセージを追加(Write)します。ここでmsgもstringからバイトスライスにコンバートする必要があります。

3行目でハッシュhにnilを足してhexにエンコードしたものをreturn しています。

HMAC別の書き方

func demoHmac2(msg, key string) string {
	h := hmac.New(sha256.New, []byte(key))
	io.WriteString(h, msg)
	return fmt.Sprintf("%x", h.Sum(nil))
}

ファンクション内、2行目と3行目が違いますが、やっていることは同じです。

io.WriteStringの中ではタイプを判定した後、必要に応じて型変換を行っています。

<io.go抜粋>

// WriteString writes the contents of the string s to w, which accepts a slice of bytes.
// If w implements StringWriter, its WriteString method is invoked directly.
// Otherwise, w.Write is called exactly once.
func WriteString(w Writer, s string) (n int, err error) {
	if sw, ok := w.(StringWriter); ok {
		return sw.WriteString(s)
	}
	return w.Write([]byte(s))
}


詳しく知りたい方へ :

Golang 公式サイト

Golang

Posted by Kanata