gpt4 book ai didi

github - Clojure(或 Java)相当于 Ruby 的 HMAC.hexdigest

转载 作者:行者123 更新时间:2023-12-01 14:45:09 29 4
gpt4 key购买 nike

当使用 Github API 设置 webhook 时,我可以提供一个 secret 。当 Github 向我发送 POST 请求时,使用了这个 secret to encode one of the headers :

The value of this header is computed as the HMAC hex digest of the body, using the secret as the key.

在手册页上,它们链接到 this Ruby example

OpenSSL::HMAC.hexdigest(HMAC_DIGEST, secret, body)

我需要一种在 Clojure 中重现这一行的方法。

谷歌搜索,我发现了一些用于此目的的示例函数( 123 ),但它们都不起作用。我显然做错了什么,因为它们都提供相同的结果,但它与我从 Github 收到的 header 不匹配。

例如,这是我想出的最简单的实现。

(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 正在以十六进制打印,但我所有尝试将输出格式化为十六进制导致的字符串比那个长得多。我做错了什么?

最佳答案

试试这个,excerpted from my github repo :

(ns crypto-tutorial.lib.hmac-test
(:require [clojure.test :refer :all]
[crypto-tutorial.lib.util :refer :all]
[crypto-tutorial.lib.hmac :as hmac]))

(defn sha-1-hmac-reference-impl [key bytes]
(let [java-bytes (->java-bytes bytes)
java-key (->java-bytes key)]
(->>
(doto (javax.crypto.Mac/getInstance "HmacSHA1")
(.init (javax.crypto.spec.SecretKeySpec. java-key "HmacSHA1")))
(#(.doFinal % java-bytes))
(map (partial format "%02x"))
(apply str))))

关于github - Clojure(或 Java)相当于 Ruby 的 HMAC.hexdigest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31729163/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com