【问题标题】:Secret from Gogs hook (failing to get on python3)Gogs 钩子的秘密(无法上 python3)
【发布时间】:2019-05-13 21:04:22
【问题描述】:

我正在配置一个 gogs 挂钩,我有一个从推送接收此 POST 的 API 例如

秘密:myS3cr3t

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

然后在python3中我得到了这样的:

message 是来自请求的有效负载(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 中显然更短;)

【问题讨论】:

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


    【解决方案1】:

    似乎具有有效负载的变量没有转义某些字符,因为我使用的是 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
    

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 2023-02-07
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2018-08-19
      • 2015-02-21
      相关资源
      最近更新 更多