【发布时间】:2015-10-22 03:05:39
【问题描述】:
使用 Github API 设置 webhook 时,我可以提供一个秘密。当 Github 向我发送 POST 请求时,使用了这个秘密 to encode one of the headers:
此标头的值计算为正文的 HMAC 十六进制摘要,使用密钥作为密钥。
在手册页上,它们链接到this Ruby example
OpenSSL::HMAC.hexdigest(HMAC_DIGEST, secret, body)
我需要一种在 Clojure 中重现这一行的方法。
谷歌搜索,我找到了一些用于此目的的示例函数 (1,2,3),但它们都不起作用。我显然做错了什么,因为它们都提供相同的结果,但它与我从 Github 收到的标头不匹配。
例如,这是我设法编写的最简单的实现。
(ns website.test
(:import javax.crypto.Mac
javax.crypto.spec.SecretKeySpec
org.apache.commons.codec.binary.Base64))
;;; Used in core.clj to verify that the payload matches the secret.x
(defn- hmac
"Generates a Base64 HMAC with the supplied key on a string of data."
[^String data]
(let [algo "HmacSHA1"
signing-key (SecretKeySpec. (.getBytes hook-secret) algo)
mac (doto (Mac/getInstance algo) (.init signing-key))]
(str "sha1="
(String. (Base64/encodeBase64 (.doFinal mac (.getBytes data)))
"UTF-8"))))
用特定的hook-secret 集合在特定的body 上调用它,给我"sha1=VtNhKZDOHPU4COL2FSke2ArvtQE="。同时,我从 Github 得到的 header 是sha1=56d3612990ce1cf53808e2f615291ed80aefb501。
显然,Github 是以十六进制打印的,但我所有将输出格式化为十六进制的尝试都导致了比那个长得多的字符串。我做错了什么?
【问题讨论】:
标签: github clojure hmac hmacsha1