Gogs钩子的秘密(无法上python3)

时间:2018-12-12 17:34:55

标签: python python-3.x sha256 hmac gogs

我正在配置gos挂钩,我有一个API可以从push接收此POST 例如

秘密:myS3cr3t

假定“秘密将通过X-Gogs-Signature标头作为有效载荷的SHA256 HMAC十六进制摘要发送。”

然后在python3中我像这样:

消息是请求中的有效负载(json主体),也是我在env var上设置的密钥

import hashlib
import hmac

def get_secret_signature(message, secret):
   signature = hmac.new(bytes(key, 'utf-8'), bytes(message, 'utf-8'), hashlib.sha256).hexdigest()
   return signature 

但是当检查挂钩失败时,会导致X-Gogs-Signature中发送的签名与python上生成的签名不匹配

甚至将逻辑与jenkins gogs插件进行比较:

public static String encode(String data, String key) throws Exception {
        final Charset asciiCs = Charset.forName("UTF-8");
        final Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        final SecretKeySpec secret_key = new javax.crypto.spec.SecretKeySpec(asciiCs.encode(key).array(), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        return Hex.encodeHexString(sha256_HMAC.doFinal(data.getBytes("UTF-8")));
}

我认为这与python中的逻辑相同,显然在python中更短;)

1 个答案:

答案 0 :(得分:0)

似乎具有有效负载的变量没有转义某些字符,因为我使用的是python框架Bottle,这是获取有效负载的正确方法:

payload = request._get_body_string()
gogs_signature = request.get_header('X-Gogs-Signature')

signature = get_secret_signature(payload, secret)
.
.
.
if gogs_signature != signature:
   print("Signature error")

def get_secret_signature(message, secret):
   signature = hmac.new(bytes(key, 'utf-8'), message, hashlib.sha256).hexdigest()
   return signature