🦁

GolangでHmac署名

2022/10/21に公開

GolangでHmac署名する

"crypto/hmac"パッケージを使用する

var signature = "header signature..."
var key = "secret key..."

func checkHmac() bool {
	HMAC := hmac.New(sha256.New, []byte(key))
	HMAC.Write(payload)
	sig := HMAC.Sum(nil)
	hash := hex.EncodeToString(sig)
	fmt.Println("hash: ", hash)

	return hmac.Equal([]byte(signature), []byte(hash))
}

まずkeyをハッシュ化し、その後にpayload(ボディデータ)を書き加える。それをSum(nil)メソッドを使用して[]btyeとして出力される。
今回の背景では別サービスのwebhookを活用したのでpayloadの部分は送られてくるリクエストボディを構造体に変換し、その後に[]btye化した。
(自分の言語への理解が足りないと思っているのですが、interface{}への当てはめだと思った値が出力されなかったので、専用の構造体としてフィールドも用意しないといけない)
今回はhex.EncodeToString()として文字列として一度変換している。
最後の行の

return hmac.Equal([]byte(signature), []byte(hash))

で、[]btyeにキャストしてメソッド内で真偽値を返す。文字列で==を見てもいいいと思うが、公式ドキュメントにも上記メソッドが使われていたのでこちらを採用するようにした。

Discussion