hmacとはハッシュメッセージ認証コードの略で、API認証に利用される、認証方式のことです。 クライアントからサーバーへ秘密情報を送信せずに認証できるメリットがあります。
クライアントから送られるハッシュ化された情報を、
クライアントから送られてきたキーと同じキーに紐づけられたデータを使用して、
サーバーでも再現し、情報が一致することをもって、認証成功とします。
処理の手順は大方定式化されているため、
その手順を覚えてしまうのが良いようです。
下記例では、サーバーの処理を関数に見立てて、
その関数内での処理結果と、main関数での処理結果を照合する処理を記載しています。
var DB = map[string]string{ // サーバーが持っている情報と仮定したmap
"User1Key": "User1Secret",
"User2Key": "User2Secret",
}
func Server(apiKey, sign string, data []byte) {
apiSecret := DB[apiKey]
h := hmac.New(sha256.New, []byte(apiSecret))
h.Write(data)
expectedHMAC := hex.EncodeToString(h.Sum(nil)) // byte配列を返すSum()を使い(足す物はないので引数はnil)、stringにエンコードし、認証情報を生成。byte配列はnilとの比較しかできないため、stringにエンコードする必要がある
fmt.Println(sign == expectedHMAC) // main関数から送られた情報との照合
}
func main() {
const (
apiKey = "User1Key"
apiSecret = "User1Secret"
)
h := hmac.New(sha256.New, []byte(apiSecret)) // sha256アルゴリズムでハッシュ化するhを生成し、apiSecretを鍵とする
data := []byte("someData")
h.Write(data) // 必要な情報を書き込む
sign := hex.EncodeToString(h.Sum(nil)) // byte配列を返すSum()を使い(足す物はないので引数はnil)、stringにエンコードし、認証情報を生成。byte配列はnilとの比較しかできないため、stringにエンコードする必要がある
Server(apiKey, sign, data) // サーバーへの送信に見立てた関数を実行
}
認証情報(sign)の生成には、タイムスタンプも合わせて利用されるケースがあります。